- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
为什么下面的断言有效:
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;
注意 number
是 number | 的子类型 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/
我在我的 Xcode 项目目录中输入了以下内容: keytool -genkey -v -keystore release.keystore -alias mykey -keyalg RSA \
假设我有一个像这样的 DataFrame(或 Series): Value 0 0.5 1 0.8 2 -0.2 3 None 4 None 5 None
我正在对一个 Pandas 系列进行相对繁重的应用。有什么方法可以返回一些打印反馈,说明每次调用函数时在函数内部进行打印还有多远? 最佳答案 您可以使用跟踪器包装您的函数。以下两个示例,一个基于完成的
我有一个 DataFrame,其中一列包含列表作为单元格内容,如下所示: import pandas as pd df = pd.DataFrame({ 'col_lists': [[1, 2
我想使用 Pandas df.apply 但仅限于某些行 作为一个例子,我想做这样的事情,但我的实际问题有点复杂: import pandas as pd import math z = pd.Dat
我有以下 Pandas 数据框 id dist ds 0 0 0 0 5 1 0 0 7 2 0 0
这发生在我尝试使用 Gradle 构建时。由于字符串是对象,因此似乎没有理由发生此错误: No signature of method: java.util.HashMap.getOrDefault(
您好,有人可以解释为什么在 remaining() 函数中的 Backbone 示例应用程序 ( http://backbonejs.org/examples/todos/index.html ) 中
我有两个域类:用户 class User { String username String password String email Date dateCreated
问题陈述: 一个 pandas dataframe 列系列,same_group 需要根据两个现有列 row 和 col 的值从 bool 值创建。如果两个值在字典 memberships 中具有相似
apporable 报告以下错误: error: unknown type name 'MKMapItem'; did you mean 'MKMapView'? MKMapItem* destina
我有一个带有地址列的大型 DataFrame: data addr 0 0.617964 IN,Krishnagiri,635115 1 0.635428 IN,Chennai
我有一个列表list,里面有这样的项目 ElementA: Number=1, Version=1 ElementB: Number=1, Version=2 ElementC: Number=1,
我正在编译我的源代码,它只是在没有运行应用程序的情况下终止。这是我得到的日志: Build/android-armeabi-debug/com.app4u.portaldorugby/PortalDo
我正在尝试根据另一个单元格的值更改单元格值(颜色“红色”或“绿色”)。我运行以下命令: df.loc[0, 'Colour'] = df.loc[0, 'Count'].apply(lambda x:
我想弄清楚如何使用 StateT结合两个 State基于对我的 Scalaz state monad examples 的评论的状态转换器回答。 看来我已经很接近了,但是在尝试申请 sequence
如果我已经为它绑定(bind)了集合,我该如何添加 RibbonLibrary 默认的快速访问项容器。当我从 UI 添加快速访问工具项时,它会抛出 Operation is not valid whi
在我学习期间Typoclassopedia我遇到了这个证明,但我不确定我的证明是否正确。问题是: One might imagine a variant of the interchange law
我是一名优秀的程序员,十分优秀!