我试图用对象析构来缩小受歧视类型的范围,但没有成功.我以为打字本能从v4.4年前就推断出来.

但是,此代码中的I cannot do it(仅为IDEA的一个示例):

type WritableRecord = {
    someField: 'a'
}

type ReadonlyRecord = {
    otherField: 'b'
}

type Writable = {
    readonly: false;
} & WritableRecord;

type Readonly = {
    readonly: true;
} & ReadonlyRecord;

export type RecordProps = Readonly | Writable

type Fn = (props: RecordProps) => void

const fn: Fn = ({ readonly, ...props }) => {
    switch (readonly) {
        case true:
            const readonlyCheck: ReadonlyRecord = props

            break;
        case false:
            const writableCheck: WritableRecord = props
            break
    }
}

但在不 destruct it works的情况下:

type WritableRecord = {
    someField: 'a'
}

type ReadonlyRecord = {
    otherField: 'b'
}

type Writable = {
    readonly: false;
} & WritableRecord;

type Readonly = {
    readonly: true;
} & ReadonlyRecord;

export type RecordProps = Readonly | Writable

type Fn = (props: RecordProps) => void

const fn: Fn = (props) => {
    switch (props.readonly) {
        case true:
            {
                const { readonly, ...readonlyProps } = props
                const readonlyCheck: ReadonlyRecord = readonlyProps
                break;
            }


        case false:
            {
                const { readonly, ...writableProps } = props
                const writableCheck: WritableRecord = writableProps
                break;
            }
    }
}

也许,我的V4.4声明是错误的,还是有错误?

推荐答案

您已经发现,目前(从TS4.7开始)不支持非 struct 化rest elements的控制流分析.这是Typescript 的一个已知缺失功能,要求在microsoft/TypeScript#46680.

如果您想看到这一点得到支持,您可能想要转到那个问题并给它一个????,但它可能不会有太大的影响.现在,您可能只需要对REST元素进行after次判断,就像您在第二个示例中所做的那样.

Typescript相关问答推荐

泛型函数类型验证

角形标题大小写所有单词除外

无法将select选项的值设置为ngFor循环中的第一个元素

扩展函数签名中的参数类型,而不使用泛型

是否有一个版本的联合类型递归地使属性只出现在一个可选选项中?

分解对象时出现打字错误

在Reaction-Native-ReAnimated中不存在Animated.Value

Select 下拉菜单的占位符不起作用

将接口映射到交叉口类型

回调函数中的TypeScrip类型保护返回Incorect类型保护(具有其他未定义类型的返回保护类型)

创建一个函数,该函数返回一个行为方式与传入函数相同的函数

为什么TypeScrip假定{...省略类型,缺少类型,...选取类型,添加&>}为省略类型,缺少类型?

有没有更干净的方法来更新**key of T**的值?

替换typescript错误;X类型的表达式可以';t用于索引类型Y;带有未定义

如何使对象同时具有隐式和显式类型

通过函数传递确切的类型,但验证额外的字段

如何在TypeScript中将元组与泛型一起使用?

使用本机 Promise 覆盖 WinJS Promise 作为 Chrome 扩展内容脚本?

如何使用动态生成的键和值定义对象的形状?

组件的第二个实例使用 svelte 中第一个实例上设置的函数