在声明时初始化和声明后赋值之间有区别吗

时间:2019-12-23 04:12:03

标签: typescript

这是代码:

[初始化版本]

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.])

我认为这是打字稿编译器错误,还是我对打字稿行为的理解不正确?

1 个答案:

答案 0 :(得分:0)

此行为的原因是,在第一种情况下,您声明了类型,而在第二种情况下,则是由控制流推断出来的。

这意味着在第一个示例中,编译器仅检查您分配给C的对象是否可分配给myList,然后假定它是ContactList,而在第二种情况下在您分配ContactList不可选择的list属性时推断出另一种类型。

如果将第一个初始化版本更改为此:

list

该错误不再存在,尽管我知道您要声明该错误,以便在初始化错误的情况下在那一行发生错误。