这是代码:
[初始化版本]
interface ContactList {
group?: string,
list?: {
name: string,
tel: string
}[]
}
const myList: ContactList = {
group: 'Friends',
list: [{
name: 'James',
tel: '1234-5678'
}]
}
[分配版本]
interface ContactList {
group?: string,
list?: {
name: string,
tel: string
}[]
}
const myList: ContactList = {
group: 'Friends',
}
myList.list = [{
name: 'James',
tel: '1234-5678'
}]
几乎是相同的,但是在该代码之后,打字稿编译器在以下代码上引发[Initialize ver。]错误:
myList.list.push({name: 'Amy', tel: '2345-6789'});
// cause an error : Object is possibly 'undefined' (not cause an error for [Assign ver.])
我认为这是打字稿编译器错误,还是我对打字稿行为的理解不正确?
答案 0 :(得分:0)
此行为的原因是,在第一种情况下,您声明了类型,而在第二种情况下,则是由控制流推断出来的。
这意味着在第一个示例中,编译器仅检查您分配给C
的对象是否可分配给myList
,然后假定它是ContactList
,而在第二种情况下在您分配ContactList
不可选择的list
属性时推断出另一种类型。
如果将第一个初始化版本更改为此:
list
该错误不再存在,尽管我知道您要声明该错误,以便在初始化错误的情况下在那一行发生错误。