strictNullCheck打字稿中的可迭代对象

时间:2018-12-03 14:18:25

标签: typescript

TypeScript(v。3.2.1)中的strictNullChecks可能存在以下问题:

interface IData {
    data?: { payload: string };
}
const list: IData[] = [];
const index: number = 0;

//test a
if (list[index].data)
    list[index].data.payload = "a";

//test b
const item = list[index].data;
if (item)
    item.payload = "a";

为什么“测试a”会导致警告“对象可能未定义” 和“测试b”不是吗? 我有很好的理由吗?

http://www.typescriptlang.org/play/#src=interface%20IData%20%7B%0D%0A%20%20%20%20data%3A%20%7B%20payload%3A%20string%20%7D%20%7C%20undefined%3B%0D%0A%7D%0D%0Aconst%20list%3A%20IData%5B%5D%20%3D%20%5B%5D%3B%0D%0Aconst%20index%3A%20number%20%3D%200%3B%0D%0A%0D%0A%2F%2Ftest%20a%0D%0Aif%20(list%5Bindex%5D.data)%0D%0A%20%20%20%20list%5Bindex%5D.data.payload%20%3D%20%22a%22%3B%0D%0A%0D%0A%2F%2Ftest%20b%0D%0Aconst%20item%20%3D%20list%5Bindex%5D.data%3B%0D%0Aif%20(item)%0D%0A%20%20%20%20item.payload%20%3D%20%22a%22%3B

1 个答案:

答案 0 :(得分:0)

“最接近的可比性”关键区别在于:

if (list[0].data)
    list[0].data.payload = "a"; // OK

...和...

if (list[index].data)
    list[index].data.payload = "a"; // Possibly NULL!

这个问题为什么一个与另一个不同的答案实际上是在编译期间需要执行的分析量。 GitHub上有一篇有趣的关于trade-offs in control flow analysis的帖子,可以帮助解释这一点。

对于您而言,index变量的使用目前可以防止类型保护程序停留。您对中间变量的解决方案非常实用。

const item = list[index].data;
if (item)
    item.payload = "a";