以下通过 Typescript 类型检查器 (v2.9.1),但TypeError在运行时抛出 a 。
interface Item { id: string }
const list: Item[] = [{ id: 'a' }, { id: 'b' }];
const item = list[3]; // type: Item
const itemId = item.id; // type: string
Run Code Online (Sandbox Code Playgroud)
鉴于访问类型化数组中的元素总是可以返回undefined, item 不应该是item: Item | undefined,这会迫使您进行空检查吗?
更令我惊讶的是,以下还进行了类型检查:
const item2: Item | undefined = list[3];
const item2Id = item2.id;
Run Code Online (Sandbox Code Playgroud)
虽然转换返回的值确实成功地失败了类型检查:
const item3 = list[3] as Item | undefined;
const item3Id = item3.id; // [ts] Object is possibly 'undefined'.
Run Code Online (Sandbox Code Playgroud)
创建显式类型的访问器函数也会捕获未定义的情况,但会增加不必要的开销:
const getItem1 = (index: number, items: Item[]): Item | undefined => items[index];
const item3 = getItem1(3, list);
const item3Id = item3 && item3.id;
Run Code Online (Sandbox Code Playgroud)
这是打字稿的已知限制吗?是否有推荐的模式或库来处理这种情况?
jca*_*alz 25
您已经发现索引签名不会| undefined像可选属性那样添加到元素类型中。有人建议创建一个编译器选项来执行此操作。您可以阅读该建议中的评论;它们与其他问题有关,但一致认为高误报率将使其几乎无用。
还提到您可以手动添加| undefined到元素类型:
const list: (Item | undefined)[] = [{ id: 'a' }, { id: 'b' }];
Run Code Online (Sandbox Code Playgroud)
它将按照您的预期运行,而不会影响整个语言。
打字稿4.1引入了--noUncheckedIndexedAccess编译器标志,实现在建议微软/打字稿#13778到账户undefined这种方式。请注意,该功能不会作为--strict编译器选项集的一部分启用,而是被称为“迂腐的索引签名”,因为它最终会抱怨undefined在程序员可能不期望或不想要它的情况下的可能性。
| 归档时间: |
|
| 查看次数: |
6020 次 |
| 最近记录: |