当前位置: 首页 > 知识库问答 >
问题:

TypeScript Duck Typing,不显示属性字符串为number的错误

范宏大
2023-03-14

概述

在下面的代码中,我已经完全理解了。这就是为什么我们使用鸭式打字。

//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};

问题

let obj3 : {id:number, [obj3: number]: number};
obj3 = {id: 1, rollno: "Why error is not showing here?"};

当我将rollno赋给字符串值时,为什么没有因为[obj:number]:number索引签名而出现错误?

请用你的答案简单解释一下。如果我的索引签名的概念还不清楚。

共有1个答案

百里京
2023-03-14

您的解释:此对象的所有键必须是数值,并且所有值必须是number类型

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

考虑array 。它具有boolean类型的数字索引签名,因为例如访问arr[0]会生成boolean类型的值。但是arr.toString(一个属于String类型的键)具有type()=>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

相反,这些属性不是OK的,因为以数值命名的属性不适合索引签名类型:

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 };
 类似资料:
  • 我希望可视化发送到传单/JavaScript应用程序的以下GeoJSON对象。如何可视化显示属性的所有线字符串。每个线条字符串的名称参数(例如,通过工具提示)。 {“features”:[{“type”:“Feature”,“properties”:{“name”:“0”},“geometry”:{“type”:“LineString”,“坐标”:[[10.941445541381836,52.4

  • 我正在尝试使用PowerShell进度条,但-status参数未按公布的方式工作(或者我错误地阅读了文档)。 为了简单起见,假设我有一个集合: ...我有另一种方法可以迭代这个集合。但是当它迭代时,处理需要很长时间。所以我想通过在循环中调用来给用户状态。 这是进步的代码。 这与: https://blogs.technet.microsoft.com/heyscriptingguy/2011/01

  • 问题内容: 我正在从数据库读取属性文件。我检查了,没有方法可以从实例中解析。有什么办法吗? 问题答案: 没错,没有从a读取方法,但实际上它有从or 读取的更通用的方法。 因此,如果您有某种方式将您的信息以任何一种方式呈现出来,那么您可以致电,即有效地逐个迭代字符的源。这感觉它应该存在,并且确实存在-java.io.StringReader。 那么,将其组合起来非常简单:

  • 我有一个简单的不透明度滑块使用反应钩,看起来像这样 我在像这样的表中设置不透明度 但当我运行我的应用程序时,DOM中的不透明度显示为一个字符串,如下所示 为什么不透明度值显示为字符串而不是数字?

  • getter称为getShowName()、getEpsWatched()和getShowStatus(),它们获得变量showName、epsWatched和showStatus。 这里怎么了?显示字符串,但不显示int。

  • 问题内容: 我在下面的代码块上收到此错误。 我还发现了表明存在功能的链接。 http://definitelytyped.org/docs/typescript-services-- typescriptServices/classes/typescript.stringutilities.html 我会错过一些文件吗? 问题答案: 是ES6函数,因此您需要以TypeScript编译器设置为目标,