TypeScript Duck Typing,未将属性字符串显示为数字错误
Posted
技术标签:
【中文标题】TypeScript Duck Typing,未将属性字符串显示为数字错误【英文标题】:TypeScript Duck Typing, not showing error on property string into number 【发布时间】:2016-10-29 21:44:47 【问题描述】:不重复
这不是重复的问题,因为这里我的问题是索引签名而不是对象文字或类型注释。请仔细阅读我的问题。
几天后我开始学习 TypeScript。当我到达主题鸭打字时。我对它的一些基本规则感到困惑。
概述
在下面的代码中,我已经完全理解了。这就是我们使用鸭式打字的原因。
//Object declaration & initialization
let obj1 : id:number, name:string;
obj1 = id: 1,name: "Ahmer Ali Ahsan";
//Error, missing property name
obj1 = id:1;
let obj2 : id:number, [obj2: string]:any;
obj2 = id: 1, firstname: "Ahmer";
//We add new property members due to index signatures
obj2 = id: 2, firstname: "Ahmer", middlename:"Ali", lastname: "Ahsan";
//We erase property members due to index signatures
obj2 = id:2;
问题
我有一个问题,如果 TypeScript 是一种类型安全语言。然后在下面的代码中,我的所有参数类型都是数字,索引签名类型也是数字。
let obj3 : id:number, [obj3: number]: number;
obj3 = id: 1, rollno: "Why error is not showing here?";
问题
当我将rollno
分配给字符串值时,为什么[obj: number]: number
索引签名没有错误?
请简要说明您的答案。如果我对索引签名的概念还不清楚。
【问题讨论】:
Type definition in object literal in TypeScript的可能重复 @Sheepy 这不是一个重复的问题,因为我不考虑类型注释或对象文字。我的问题与索引签名有关。请仔细准备我的问题和完整的细节。谢谢 【参考方案1】:你的解释:这个对象的所有键必须是数字,所有值必须是number
类型的
实际解释:数字键到达的所有值都必须是number
类型
考虑Array<boolean>
。它有一个数字索引签名来键入boolean
,因为例如访问arr[0]
会产生boolean
类型的值。但是arr.toString
(一个string
类型的键)有() => string
类型,这显然和boolean
不一样。
编辑添加基于 cmets。
让我们考虑一个声明:
var x: [n: number]: boolean; ;
这是一个数字索引签名。数字索引签名表示具有数字名称的属性与特定类型匹配。它们对具有非数字名称的属性没有影响。
数字索引签名仅约束具有数字名称(不是字符串名称)的属性
数字索引签名仅约束具有数字名称(不是字符串名称)的属性
数字索引签名仅约束具有数字名称(不是字符串名称)的属性
换句话说,这些都可以,因为它们的键名不是数字:
x = hello: 100 ; // OK! 'hello' is not numeric
x = rollno: 'wat!'; // OK! 'rollno' is not numeric
x = lookThisIsNotNumeric: false ; // OK! 'lookThisIsNotNumeric' is not numeric
相反,这些是不好的,因为数字命名的属性不适合索引签名类型:
x = 1: 'hello' ; // Error! 1 is a number and 'hello' is not a boolean
x = 10: 653 ; // Error! 10 is a number and 653 is not a boolean
x = 25: 'hello' ; // Error! 25 is a number and 'hello' is not a boolean
最后,这是 OK,因为数字命名的属性有一个布尔值:
x = 42: true ;
【讨论】:
感谢您的回答。但对我来说很容易理解。如果您在答案中引用我的索引签名示例。 在我的示例参数中,rollno 的类型为 number,但在下面的行中,我输入了字符串而不是数字。为什么它没有显示错误?rollno
不是数字,而是字符串。字符串键值不受数字索引签名的约束,因为您无法通过数字键看到。
换句话说,如果门上的标语写着“所有戴帽子的人都必须穿鞋”,并且有人带着no hat和no从门进来鞋子,这不违反标志。同样在这里,索引签名所隐含的规则是“所有带有数字键的属性都必须是数字”。
我理解您的最后一条评论,但不理解您的倒数第二条评论。如果我的 rollno 不是数字,那么在我的索引签名中为什么我使用类型号 [obj3: number]
。请清除我的错误理解。以上是关于TypeScript Duck Typing,未将属性字符串显示为数字错误的主要内容,如果未能解决你的问题,请参考以下文章