gpt4 book ai didi

javascript - TypeScript 中的索引签名不处理未定义的

转载 作者:搜寻专家 更新时间:2023-10-30 21:03:19 26 4
gpt4 key购买 nike

我想我基本上了解了索引签名在 TypeScript 中的工作原理。但是,有一件事我不明白。给定以下示例代码:

const sales: {[ key: string ]: number } = {
a: 532,
b: 798,
c: 264
};

console.log(sales.a);
console.log(sales.d);

现在编译器说,sales.asales.d类型为 number .但那不应该是number | undefined吗? ,因为编译器不知道是否 a和/或 d真的有吗?

我不能在这里想出一个具体的接口(interface),因为ad是在运行时任意选择的,而不是预定义的。

我可以通过使用来解决这个问题

{[ key: string ]: number | undefined }

作为一种类型,但这似乎很麻烦且令人讨厌(考虑到对象在 JavaScript 中的典型使用方式,对于一个非常微不足道的问题来说,这是一个非常蹩脚的解决方案)。

因此,有人可能会说:对我来说,这似乎违反直觉:索引签名有什么意义,如果它们实际上对地球上的 每个 可能字符串强制执行,那么它也有一个值?这对哪种类型是正确的?

实际上没有比想出一个更简单的解决方案了吗

{[ …: string ]: … | undefined }

一遍又一遍地打字?没有集成到语言中?

很难相信,因为有像 Partial<T> 这样的专业。和合作。 ……对此有什么想法吗?

PS:是Record<T> (语义上)与 {[ key: string ]: T | undefined } 相同?

最佳答案

typescript 4.1+ 更新

现在有一个 --noUncheckedIndexedAccess compiler option启用后,在从索引签名属性读取时包括 undefined。此选项不是 --strict 编译器选项套件的一部分,因为它的破坏性更改太多,而且一些解决方法很烦人。


TS4.1 之前的答案:

这已作为建议提出(请参阅 microsoft/TypeScript#13778)并且基本上已被拒绝(尽管它被列为“等待更多反馈”),因为预计它会导致比修复更多的错误。你是对的,目前的情况是不一致的,技术上不正确/不合理,但它是not one of TypeScript's goals “应用健全的或‘可证明正确的’类型系统。相反,[它应该]在正确性和生产力之间取得平衡。”

TypeScript 实际上并没有强制存在匹配索引的每个可能的键(因此索引签名属性实际上是可选的),但它确实强制的任何此类键em> present 具有正确类型的定义值...这是 TypeScript 中为数不多的 missing and undefined are distinguished 的地方之一.

如您所述,如果您希望自己的索引签名类型与其他可选属性的行为相同(意味着 undefined 自动成为可能的值),您可以添加 | undefined 到属性类型。如果您希望现有的索引签名类型以这种方式运行(如 Array),您必须 fork your own copy of the standard library and do it for yourself .他们不会在上游这样做,因为 it would make lots of people very sad to deal with this .

如果你真的想看到这个改变,你可能想要 visit the GitHub issue和评论或投票,但我不会屏住呼吸......你的时间可能更好地花在过去(我的经验是......在处理 TypeScript 的语用不一致时我不得不这样做几次。)

希望对您有所帮助。祝你好运!

关于javascript - TypeScript 中的索引签名不处理未定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57337747/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com