gpt4 book ai didi

reactjs - 为什么对象文字 `{a}` 的 TypeScript 断言适用于接口(interface) `{a, b}` 而不是 `{a?, b}`

转载 作者:搜寻专家 更新时间:2023-10-30 20:38:24 25 4
gpt4 key购买 nike

为什么下面的断言有效:

interface AllRequired {
a: string;
b: string;
}

let all = {a: "foo"} as AllRequired; // No error

但是这个断言给出了一个错误:

interface SomeOptional {
a?: string;
b: string;
}

let some = {a: "foo"} as SomeOptional; // Error: Property 'b' missing

我能看到的唯一区别是将其中一个接口(interface)属性设为可选 (?)。似乎如果所有属性都不是可选的,我可以向接口(interface)断言部分对象,但只要任何接口(interface)属性都是可选的,我就不能再断言部分对象了。这对我来说真的没有意义,我一直无法找到这种行为的解释。这是怎么回事?


对于上下文:我 encountered this behavior在尝试解决 React 的 setState() 接受部分状态对象的问题时,TypeScript doesn't yet have partial types使它与您的状态界面一起正常工作。作为一种解决方法,我想出了 setState({a: "a"} as MyState) 并发现只要接口(interface) MyState 字段是 all 非可选,但一旦一些 属性是可选的,就会失败。 (使所有属性可选是一种解决方法,但在我的情况下非常不受欢迎。)

最佳答案

类型断言只能用于类型和它的子类型之间的转换。

假设您声明了以下变量:

declare var foo: number | string;
declare var bar: number;

注意 numbernumber | 的子类型 string,表示任何匹配 number 类型的值(例如 3)也匹配 number |字符串。因此,允许使用类型断言在这些类型之间进行转换:

bar = foo as number; /* convert to subtype */
foo = bar as number | string; /* convert to supertype (assertion not necessary but allowed) */

类似地,{ a: string, b: string }{ a: string } 的子类型。匹配 { a: string, b: string } 的任何值(例如 { a: "A", b: "B"})也匹配 { a : string ,因为它有一个 a 类型的 string 属性。

相比之下,{ a?: string, b: string }{ a: string } 都不是另一个的子类型。一些值(例如 { b: "B"})仅匹配前者,而其他值(例如 { a: "A"})仅匹配后者。

如果您真的需要在不相关的类型之间进行转换,您可以通过使用通用父类(super class)型(例如any)作为中间类型来解决这个问题:

let foo = ({ a: "A" } as any) as { a?: string, b: string };

规范中的相关部分是4.16 Type Assertions :

In a type assertion expression of the form < T > e, e is contextually typed (section 4.23) by T and the resulting type of e is required to be assignable to T, or T is required to be assignable to the widened form of the resulting type of e, or otherwise a compile-time error occurs.

关于reactjs - 为什么对象文字 `{a}` 的 TypeScript 断言适用于接口(interface) `{a, b}` 而不是 `{a?, b}`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36652622/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com