TS2536:即使类型必须是键,也不能用作索引?

我正在尝试向此函数添加类型:

setKey(key: keyof TData|string|string[], value: typeof key extends keyof TData ? TData[typeof key] : any) {
    this.set(setIn(key,value));
}

基本上key应该是一个keyof TData,但它也可以接受fancy.dotted.syntax['array','path','syntax']并且很难正确键入-但是,如果您确实提供了一个简单的索引,那么我也希望该值也输入类型完成。我以为可以为此使用条件类型,但也许TS编译器无法处理?还是我做错了?

基本上,我希望typeof key extends keyof TData ?可以缩小的类型范围,key以便随后的工作可行,但TS仍然认为它可能是string|string[]

密钥类型

提香·切尔尼科娃·德拉戈米尔

typeof keykeyof TData|string|string[]无论您传递给函数什么内容,它将始终是声明的类型您想要捕获呼叫站点的类型,为此,您需要使用类型参数(必须扩展为keyof TData|string|string[])。

class DataOwner<TData> {
  setKey<TKey extends keyof TData|string|string[]>(key: TKey, value: TKey extends keyof TData ? TData[TKey] : unknown) {
  }
}

let o = new DataOwner<{ a: string }>();
o.setKey("a", "") // ok 
o.setKey("a", 1) // errr
o.setKey("x", 1) // ok, since key can be any aritrary string 

此值是受限制的IMO。由于key可以是任何字符串,因此传入不是键的任何内容都不会发生任何错误。

同样由于TKey可以string,尽管它也会扩展,但您不会得到任何建议keyof TData就关键建议而言,多个重载将更好地工作,但仍然遭受我指出的第一个问题:

class DataOwner<TData> {
  setKey<TKey extends keyof TData>(key: TKey, value: TData[TKey]): void
  setKey(key: string|string[], value: unknown): void
  setKey(key: keyof TData|string|string[], value: unknown) {
  }
}

let o = new DataOwner<{ a: string }>();
o.setKey("a", "") // ok 
o.setKey("a", 1) // errr
o.setKey("x", 1) // ok, since key can be any arbitrary string 

编辑正如注释中所指出的那样,重载在这里不能很好地工作,因为如果值不匹配,编译器将继续进行字符串重载,并且肯定会匹配,因为valueis是unknown,第一个选项是我们将要获得的最接近的值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

通用类型索引。TS2536:类型“字符串”不能用于索引类型“T”

TS2536:类型不能用于索引类型 ENUM - TS MAPPED TYPES

TS2536:类型“ keyof T2”不能用于索引类型“ T1”

类型'string'不能用于索引类型'T'.ts(2536)

Typescript:类型'undefined'不能用作索引类型.ts(2538)

类型'null'不能用作索引类型

类型“{}”不能用作索引类型

类型“X”不能用作索引类型

类型不能用作索引类型

类型'undefined'不能用作索引类型

错误 TS2538:类型“CCCustomer”不能用作索引类型

响应 yup 错误类型“未定义”不能用作索引类型。TS2538

Entity Framework Core:表“Users”中的“Id”列的类型不能用作索引中的键列

打字稿错误-类型'string []'不能用作索引类型

类型 '() => Promise<AxiosResponse<any>>' 不能用作索引类型 [ReactJs]

类型“未定义”不能用作索引类型

类型 'any[]' 不能用作索引类型 Angular 构建

类型“键”不能用于索引 TypeScript 中的类型“对象”

Typescript:作为对象键的并集的类型不能用作该对象的键

为什么我在TypeScript中遇到“类型'String'不能用作索引类型”错误

介质不能用作请求的设备类型

打字稿:从嵌套的全局对象访问值 | 键入“字符串”不能用作索引类型

内插字符串类型不能用于索引与键类型相同的记录

列是否必须相邻才能用作索引?

包的类型不能用作供应商的包的类型

F#-类型参数不能用作类型构造函数

向对象添加键/值对时,不能将“字符串”类型用作索引类型

Option键在Tmux中不能用作Meta

JavaScript:希伯来字母不能用作关联数组的键