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 hatno从门进来鞋子,这不违反标志。同样在这里,索引签名所隐含的规则是“所有带有数字键的属性都必须是数字”。 我理解您的最后一条评论,但不理解您的倒数第二条评论。如果我的 rollno 不是数字,那么在我的索引签名中为什么我使用类型号 [obj3: number]。请清除我的错误理解。

以上是关于TypeScript Duck Typing,未将属性字符串显示为数字错误的主要内容,如果未能解决你的问题,请参考以下文章

Monkey Patch/Monkey Testing/Duck Typing/Duck Test

duck typing

ZOJ 3480Duck Typing

Python笔记 · 鸭子类型 / Duck Typing

Python笔记 · 鸭子类型 / Duck Typing

Python笔记 · 鸭子类型 / Duck Typing