为什么“ value.type”会引发错误“类型“ P”上不存在属性“类型””
class A<T extends {}, P = { type: keyof T, value: T[keyof T] }> {
constructor (value: P) {
if (value.type) {
}
}
}
使用扩展可以:
class A<T extends {}, P extends { type: keyof T, value: T[keyof T] }> {
constructor (value: P) {
if (value.type) {
}
}
}
class A<P = { type: string, value: unknown }> {
constructor(value: P) {
if (value.type) { } // error, 'type' does not exist on type 'P' (good!)
}
}
new A({ foo: "bar" }) // P is { foo: string; }, cannot rely on 'type' to be present.
您不能依靠在这里P
拥有type
财产。仅当调用者未设置type参数(无法推断且未手动设置)时,才选择默认值。但这取决于调用方。
class AExtends<P extends { type: string, value: unknown }> {
constructor(value: P) {
if (value.type) { } // works
}
}
new AExtends({ value: "bar" }) // error, 'type' is missing
new AExtends({ type: "foo", value: "bar" }) // works
编译器可以确保value: P
始终具有一个property type
。它由约束条件强制执行extends { type: keyof T, value: T[keyof T] }
。
代码示例(稍微简化了代码;例如T
,不需要)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句