导文Ts中string、number和any等类型 不能当做索引用,怎么处理?报错:元素隐式具有“any”类型,因为类型为“number”的表达式不能用于索引类型“[***”。...在类型“[ ***”上找不到具有类型为“number"的参数的索引签名。 ts(7053)keyof 的使用问题Ts中string、number和any等类型 不能当做索引用,怎么处理?...const handerField = (item: number) => { caselist= data.showList[item]//报错}元素隐式地拥有 any 类型,因为 number类型不能被用于索引...{} 类型。
现象 typescript中使用变量作为索引来访问未知类型,例如泛型对象成员时,会报错TS7053 function doSomething(obj: T, prop: string) {...obj[prop] // 报错TS7053 } 报错如下: TS7053: Element implicitly has an ‘any’ type because expression of type...解决 function doSomething(obj: T, prop: keyof T) { obj[prop] } keyof 使用关键字 keyof 可以映射对象的所有键名(string...或number)作为一个联合类型 下例中的变量P相当于类型 “x” | “y” type Point = { x: number; y: number }; type P = keyof Point;...如果类型包含number或string类型的索引签名,keyof则会返回number或string 下例中变量A相当于类型 number type Arrayish = { [n: number]:
要想解决这个问题,要使用索引签名 interface Obj { a: string; [index: string]: string | number; } const obj: Obj =...因为: 当你声明一个索引签名时,所有明确的成员都必须符合索引签名 函数重载 场景:函数有多个参数,而且参数不确定时,函数运行逻辑不一致 // 重载 function padding(all: number...函数重载最重要的是,最终声明(从函数内部看到的真正声明)与所有重载兼容(与上面的索引签名一致) 下载的第三方npm库没有ts声明文件 例如: npm i somePackage --save import...根据你传入niubi这个方法的参数对象来确定的,当我们传入的a是字符串,那么T就为string.返回的就是一个item为字符串的数组 class Peter { niubi(a: T): T[...这是多态性 关于如何处理、判断TS的类型兼容性,大家可以看下面这些类型 协变(Covariant):只在同一个方向; 逆变(Contravariant):只在相反的方向; 双向协变(Bivariant)
首先,可以通过引入一个泛型参数来改善类型签名: function pluck(record: T[], key: string): any[] { // Element implicitly...要从对象上获取某个属性的值,你需要保证参数 key 是对象中的属性。...(10); // const str: string | number const str = double('ts'); 对于 double 函数,你期望传入的参数类型是 number 类型,其返回值的类型也是...当你传入的参数类型是 string 类型,其返回的类型也是 string 类型。而上面的 double 函数却是返回了 string | number 类型。...string : number 的意思是,如果 T 类型是 string 类型的子集,则 double 函数的返回值类型为 string 类型,否则为 number 类型。
现在系统能够根据你在代码中的使用方式来打印出这些类型,这意味着作为 TypeScript 用户,你可以避免显示一些烦人的巨大类型,而这往往会转化为更好的.d.ts 文件输出、错误消息和快速信息及签名帮助中的编辑器内类型显示...; } } 为了简化这类场景的操作,前不久 TypeScript 在类型带有一个字符串索引签名时加入了“点”属性访问语法(例如 person.name)。...有关更多信息,请查看原始的拉取请求: https://github.com/microsoft/TypeScript/pull/40011 可选属性和字符串索引签名之间的规则放宽 字符串索引签名是一种类型化字典型对象的方式...,从这样的索引签名中读取时包含 undefined)。...: https://github.com/microsoft/TypeScript/pull/41348 JavaScript 中的类型参数未解析为类型参数 JavaScript 中已经不允许使用类型参数
在定义函数重载的时候,要按照「精确 => 宽泛」的级层来定义函数。..."Tom", gender: "male" }; 索引签名 借助「索引签名」,可以进一步规范存储对象的结构。...索引签名的参数可以是 number 或 string。...例如下面,Info 接口就是所有的字符串字读的值必须为 number 类型: interface Info { [propName: string]: number; } interface...Info { [propName: string]: number; x: string; // 编译error:x不符合索引签名的定义 } 当然,此处也可以同时拥有两种类型的索引签名:
WARNING 请注意,这种错误提示,只会发生在对象字面量上 允许分配而外的属性: 一个类型能够包含索引签名,以明确表明可以使用额外的属性: let x: { foo: number, [x: string...为 false 时),但是 never 不能赋值给其他任何类型,除了 never TypeScript 索引签名 JavaScript 在一个对象类型的索引签名上会隐式调用 toString 方法...const obj = { toString() { return 'Hello'; } }; const foo: any = {}; // ERROR: 索引签名必须为 string...实际上,我们可以明确的指定索引签名。...当你声明一个索引签名时,所有明确的成员都必须符合索引签名: // ok interface Foo { [key: string]: number; x: number; y: number
这个索引签名表示了当用number去索引StringArray时会得到string类型的返回值。 Typescript支持两种索引签名:字符串和数字。...name: string // 错误,`name`的类型与索引类型返回值的类型不匹配 } 当然,我们也可以将索引签名设置为只读,这样就可以防止给索引赋值 interface ReadonlyStringArray...例如,基类型中键a为string,在扩展出的类型中无法将其改为number。...索引签名参数类型必须为 "string" 或 "number" interface Map { [key: string]: T; } //T[U]是索引访问操作符;U是一个属性名称。...如果不指定类型,就在定义的之后指定一个默认的类型 myLog(1) 「我们也可以把泛型变量理解为函数的参数,只不过是另一个维度的参数,是代表类型而不是代表值的参数。」
TypeScript是在告诉你函数参数有any类型,如果你记得的话,它可以是TypeScript中的任何类型。我们需要在TypeScript代码中添加适当的类型注释。 等等,到底什么是型?...看看我们的代码,我们可以想到一个简单的“模型”,命名为Link,对象的形状应该符合以下模式: 它必须有一个类型为string的url属性 在TypeScript中,你可以用一个接口来定义这个“模型”,就像这样...这里是违规的一行: return arrayElement[lookupKey].match(regex); “没有索引签名”。哇。这是一个“容易”的修复。...这意味着我们可以通过string类型的索引访问该对象的任何键,而该索引又返回另一个字符串。...那么在接口和类型之间应该使用什么呢?我更喜欢复杂对象的接口。TypeScript文档也建议了一种方法: 因为软件的理想属性是对扩展开放的,所以如果可能的话,应该始终在类型别名上使用接口。
) { let x = value; return x; } 我们可以将上面的代码粘贴到TS Playground中运行,然后将鼠标hover到变量上,发现ts会自动推断出x变量的类型,...在TypeScript 4.2中,内部结构就变得更加智能了,你可以在 TS Playground 中切换编译版本为4.2,你会发现类型推断很完美,如下图所示: 不可跟踪的rest元素 TS中我们可以用元组类型去标识一个数组的类型...在代码中,age来自于索引签名,但往往为了区别于已知字段(比如name),用户可能会想让编译器报错,这时你可以在tsconfig.json中设置: "noPropertyAccessFromIndexSignature...,编译器会报错: 另外,如果使用InstanceType也会报同样的错: 这就是为什么TypeScript 4.2允许您在构造函数签名上指定抽象修饰符。...可选属性和字符串索引签名之间的宽松规则 先看一段代码(运行环境: < TS4.2),会报错: type WesAndersonWatchCount = { "Fantastic Mr. Fox"?
: number; // [propName: string]: any 转字符串索引签名 } // [propName: string]: any // 这个索引签名是为了你能够预见某个对象可能有某些特殊的用途而准备的...// 属性名写错,可以通过索引签名的方式进行屏蔽错误 只读属性 对于一些对象属性只能在对象刚刚创建的时候修改其值,在属性前用readonly来指定只读属性: interface Point {.../ 字符串索引签名 } 函数接口 函数定义方式: 在TS中,使用一个变量直接定义函数 let add: (x: number, y: number) => number = (x, y){ return...在TS中,undefined和null是任何类型的子类型,所以可以被赋值给其他类型 设置允许被赋值为其他类型 打开tsconfig.js,将strictNullChecks = false(默认true...,传入下列3个参数: 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象 方法的名字 参数在函数参数列表中的索引 function logParams(params:any){ return
但给它赋值 number 会报错: 这种就得手动声明类型了: 还有,函数的参数,只有调用的时候才能知道参数具体的类型,这时候怎么自动推导? 没办法推导。...但手动声明的类型是有局限性的,比如这样的类型: key:string 那部分是索引签名,也就是任意的 key 为 string,value 为任意类型的索引都可以加。...但是,satisfies 的方式也有它的问题,比如这里用了推导出的类型: 那就不能动态扩展索引了: 而如果是声明的那种索引签名,是支持扩展的: 所以,具体什么时候用声明的类型,什么时候用推导出的类型...这个新语法还是很有用的,估计以后在代码里会经常看到。 不过现在还没咋见,因为他还是在 beta 的版本。...但像函数参数、需要约束的变量类型等情况下就得手动声明了。 有的时候还是自动推导出的类型更合适一些,但是还需要通过声明的方式对其中的类型做约束。 不能两全其美。
例如,我们可以编写一个带有索引签名的类型,此类型接收 string 键并映射为相应的 boolean 值。如果我们尝试分配 boolean 值以外的值,则返回错误。...同样的,Array也预先定义了 number 索引签名,允许我们插入 / 检索 T 类型的值。 // 这里是 TypeScript 内置 Array 类型定义的一部分。...; // 错误,这里需要一个「string」值 arr[1] = 123; 索引签名特别适用于在外部表达大量代码的情况;但到目前为止,索引签名仅适用于 string 及 number 键(而且...TypeScript 也无法对某些 string 键子集的索引签名进行建模——例如用于描述一切以文本 data- 作为名称开头的属性的索引签名。...}; 关于索引签名的最后一项要点是,其现在可以支持无限域原始类型的联合,具体包括: string number symbol 模板字符串模式 (例如hello-${string}) 参数为这些类型的联合的索引签名将脱糖为几个不同的索引签名
,我们把 Array 的类型扩展为 object。...类型断言是不得已的方法,应尽可能的避免。他们(暂时)删除了静态类型系统为我们提供的安全网。 注意,在 A 行中,我们还覆盖了 TypeScript 的静态类型,不过是通过类型注释完成的。...'; 9} 示例:声明索引签名 在以下代码中,我们在行 A 用了类型断言 as Dict ,以便可以访问其推断类型为 object 的值的属性。...any”类型,因为 9 // 类型'string'的表达式不能用于索引类型'{}'。...10 // 在类型“ {}”上没有找到参数类型为'string'的索引签名。
在本文中,我们将会研究它们是怎样工作的。 ---- TypeScript 的两种顶级类型 any 和 unknown 在 TypeScript 中是所谓的“顶部类型”。...顶级类型 any 如果一个值的类型为 any,那么我们就可以用它任何事: function func(value: any) { // 仅允许数字,但它们是 `any` 的子类型 5 *...value; // 通常,`value` 的类型签名必须包含 .propName value.propName; // 通常只允许带有索引签名的数组和类型 value...示例:JSON.parse( ) JSON.parse() 的结果取决于动态输入,这就是其返回类型为 any 的原因(我从函数签名中省略了参数 reviver): JSON.parse(text: string...示例:String( ) 把任意值转换为字符串的函数 String() 具有以下类型签名: interface StringConstructor { (value?
参数以接受键为字符串、值为数字的对象?...答案是使用索引签名! 让我们找到什么是TypeScript索引签名以及何时需要它们。 1.为什么要索引签名 索引签名的思想是在您只知道键和值类型时键入未知结构的对象。...索引签名适合薪水参数的情况:该函数应该接受不同结构的薪水对象-只需确保对象值是数字。...3.1不存在的财产 如果您尝试访问索引签名为{ [key: string]: string }的对象的不存在属性会发生什么? 正如预期的那样,TypeScript将值的类型推断为string。...索引签名将键类型映射到值类型-仅此而已。如果您不正确映射,值类型可能会偏离实际的运行时数据类型。 为了使键入更准确,请将索引值标记为string或undefined。
(index type query operator) T[K]:索引访问操作符(indexed access operator): 索引类型查询操作符 keyof T取类型T上的所有public属性名构成联合类型...,而不是值(因此keyof obj不合法) 这种类型查询能力在pluck等预先无法得知(或无法穷举)属性名的场景很有意义 索引访问操作符 与keyof类似,另一种类型查询能力是按索引访问类型(T[K])...| boolean'. bOrC = obj['a']; 索引类型与字符串索引签名 keyof与T[K]同样适用于字符串索引签名(index signature),例如: interface NetCache...{ a: boolean, b: boolean } type Flags = { [K in Keys]: boolean }; [K in Keys]形式上与索引签名类似,只是融合了for...in...string : number; // x 的类型为 string | number let x = f(Math.random() < 0.5) 另外,如果T或U含有类型变量,就要等到类型变量都有对应的具体类型后才能得出条件类型的结果
TS 在开发时就能给出编译错误, 而 JS 错误则需要在运行时才能暴露。 作为强类型语言,你可以明确知道数据的类型。代码可读性极强,几乎每个人都能理解。 TS 非常流行,被很多业界大佬使用。...可以把泛型理解为代表类型的参数 // 我们希望传入的值是什么类型,返回的值就是什么类型 // 传入的值可以是任意的类型,这时候就可以用到 泛型 // 如果使用 any 的话,就失去了类型检查的意义 function...StringArray { // key 的类型为 number ,一般都代表是数组 // 限制 value 的类型为 string [index:number]:string } let...string interface StringObject { // key 的类型为 string ,一般都代表是对象 // 限制 value 的类型为 string [index:string...interface Speakable { name: string; // ":" 前面的是函数签名,用来约束函数的参数 // ":" 后面的用来约束函数的返回值
接口类型我们经常说道的接口比如后端写了一个接口给前端调用,接口包括地址、参数、请求方式等等,参数规定了传参的类型。而在TS中的接口的定义是什么呢?...顾名思义,它也是一种类型,和number、string、undefined等一样,约束使用者使用,主要是用来进一步定义对象中属性的类型。它是对行为模块的抽象,具体的行为是用类来实现。...、可选属性、函数类型接口,具体如下:(1)设置属性只读我们在接口中属性前加readonly,表示该属性为只读,如果修改该属性的值话就会报错与声明的类的属性的类型不一致少写属性interface Class...= 'zhangsan';//Error(2)设置索引签名设置索引签名后,在对象数据中传入多余的属性,仍能够执行。...具体使用是在接口中定义一个 [property:string]:any,意思是定义了一个属性,属性的类型是字符串,属性值类型为任意。
领取专属 10元无门槛券
手把手带您无忧上云