TypeScript Duck键入,不将属性字符串上的错误显示为数字

时间:2016-06-27 19:03:41

标签: typescript

不重复

这不是重复的问题,因为我的问题是索引签名而不是对象文字或类型注释。请仔细阅读我的问题。

几天后我开始学习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?"};

问题

当我将字符串值放入其中时,为什么它没有向我显示索引签名参数的错误。

请简要解释一下你的答案。如果我的索引签名概念仍然不明确。

1 个答案:

答案 0 :(得分:2)

您的解释:此对象的所有键必须为数字,并且所有值必须为number

类型

实际解释:数字键达到的所有值必须为number

类型

考虑Array<boolean>。它有一个数字索引签名,可以输入boolean,例如访问arr[0]会生成boolean类型的值。但是arr.toString(一个string类型的密钥)的类型为() => string,显然与boolean不同。

编辑以根据评论添加。

让我们考虑一个宣言:

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

最后,这个 确定,因为数字命名属性有一个布尔值:

x = { 42: true };