【问题标题】:TypeScript Duck Typing, not showing error on property string into numberTypeScript Duck Typing,未将属性字符串显示为数字错误
【发布时间】: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 索引签名没有错误?

请简要说明您的答案。如果我对索引签名的概念还不清楚。

【问题讨论】:

  • @Sheepy 这不是一个重复的问题,因为我不考虑类型注释或对象文字。我的问题与索引签名有关。请仔细准备我的问题和完整的细节。谢谢

标签: typescript


【解决方案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 hatno从门进来鞋子,这不违反标志。同样在这里,索引签名所隐含的规则是“所有带有数字键的属性都必须是数字”。
  • 我理解您的最后一条评论,但不理解您的倒数第二条评论。如果我的 rollno 不是数字,那么在我的索引签名中为什么我使用类型号 [obj3: number]。请清除我的错误理解。
猜你喜欢
  • 2014-11-29
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
相关资源
最近更新 更多