当我为使用部分类型声明的变量分配部分值时,其类型仍为部分:
let x: { a: string, b?: string }
x = { a: "a" }
x.b // fine, x <=> {a:string, b?:string}
与类属性相同:
class X {
prop: { a: string, b?: string } = { a: "a" }
}
(new X).prop.b // fine, prop <=> {a:string, b?:string}
但是,继承的属性似乎并不遵循此规则,而是分配了确切的类型:
class Y extends X {
prop = { a: "a" }
}
(new Y).prop.b // FAIL, prop <=> {a:string}
如何解释这种行为?
答案 0 :(得分:1)
问题是创建了类Y,它将检查prop与类型{ a: string, b?: string }
兼容,但是它将返回您传递的对象文字的确切类型。不包含b。您可以直接返回{ a: string, b?: string }
,但随后会丢失对象文字的属性名称,这很不幸。所以您可以尝试:
((new Y).prop as { a: string, b?: string }).b