- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想我基本上了解了索引签名在 TypeScript 中的工作原理。但是,有一件事我不明白。给定以下示例代码:
const sales: {[ key: string ]: number } = {
a: 532,
b: 798,
c: 264
};
console.log(sales.a);
console.log(sales.d);
现在编译器说,sales.a
和 sales.d
类型为 number
.但那不应该是number | undefined
吗? ,因为编译器不知道是否 a
和/或 d
真的有吗?
我不能在这里想出一个具体的接口(interface),因为a
和 d
是在运行时任意选择的,而不是预定义的。
我可以通过使用来解决这个问题
{[ 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/
我得到了这个printHashKey函数,它运行良好。 fun printHashKey() { try { val info : PackageInfo = packageM
如何使用正确的签名 key 为我的 Android 应用包签名? 最佳答案 我尝试在此处和 this question 中使用多个答案, 但不知何故我收到了这个错误,因为我的 android/app/
我的 gradle 文件中有这个: android { signingConfigs { mySigningConfig { keyAlias 'the
请至少选择一个签名版本以在 Android Studio 2.3 中使用 现在在 Android Studio 中生成一个签名的 APK 时,它显示了两个选项(复选框),即 1. V1(Jar 签名)
我想表示一些标量值(例如整数或字符串)通过它的实际值或一些 NA 值,然后存储它们在集合中(例如列表)。目的是处理缺失值。 为此,我实现了一个签名 module type Scalar = sig
为什么这不完全有效? sum :: (Num a, Num b) => a -> b -> c sum a b = a + b 当然,错误消息与签名有关,但我仍然不明白原因。 Couldn't mat
谢谢帮助,我的问题是关于从下面的代码中收到的 ax 值? mov al,22h mov cl,0fdh imul cl 真机结果:ff9a 我的预期:00:9a(通过二进制相乘) 第一个数字是 22h
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我从对物体的思考中得出了一个术语。当我们扩展一个类时,扩展类将具有与父类相同的签名,因此术语 IS-A 来自...示例 class Foo{ } class Foo2 extends Foo{ } c
我需要在有符号整数和它们作为字节序列的内部表示之间进行转换。在 C 中,我使用的函数如下: unsigned char hibyte(unsigned short i) {return i>>8;}
我正在尝试使用给定的 RSA 参数对一些数据进行签名。 我给出了模数、指数、D、DP、DQ、P、Q 和 InverseQ。什么库或方法最容易使用来计算此签名。在 C# 中,一旦您提供参数,它们就会有一
这些签名之间有什么区别? T * f(T & identifier); T & f(T & identifier); T f(T & identifier); void f(T * identifie
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Where and why do I have to put the “template” and “typ
我有一个签名,我需要在签名旁边添加图片。但我不确定 css 的确切程度和内容。目前它显示在文字下方,我应该把图片放在哪里?在相同的 tr 或 td 中?
查看 LinkedHashMap 的 JDK 源代码,我注意到这个类被声明为: public class LinkedHashMap extends HashMap im
背景:我继承了一个基于 linux 的嵌入式系统,其中包含一个 SMTP 代理和一些我不得不忍受的古怪限制。它位于 SMTP 客户端和服务器之间。当 SMTP 客户端连接时,代理会打开与服务器的连接,
这是 C++17 形式的规则 ([basic.lval]/8),但它在其他标准中看起来很相似(在 C++98 中是“lvalue”而不是“glvalue”): 8 If a program attem
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我即将开展一个项目,希望使用电子签名板使用 C# 捕获客户的签名、在设备上显示文本等。 现在,在我开始做进一步的研究之前,我想向你们征求一些意见/建议,我应该使用哪些设备.. 我现在的要求非常笼统:我
呢喃自己在心中开始扩张地盘,仿佛制式地广播了三次。 漾起的涟绮,用谈不上精腻的手段。 拒绝天亮,却又贪恋着贪恋多情的日光。 川流不息的画面是他们,而我的落幕停在右脚,它渴望着下台,而我只剩自言
我是一名优秀的程序员,十分优秀!