在typescript中展开类型
我有一个类型为在typescript中展开类型,typescript,Typescript,我有一个类型为IDictionary的属性,其中字典定义为: export interface IDictionary<T = any> { [key: string]: T; } public async pushKey<K extends keyof T, KK extends keyof K>(property: K, value: K[KK]) { ... } 导出接口IDictionary{ [键:字符串]:T; } 我想定义一个方法,在这种情况下将
IDictionary
的属性,其中字典定义为:
export interface IDictionary<T = any> {
[key: string]: T;
}
public async pushKey<K extends keyof T, KK extends keyof K>(property: K, value: K[KK]) { ... }
导出接口IDictionary{
[键:字符串]:T;
}
我想定义一个方法,在这种情况下将类型限制为“string”。基本上,它打开字典并公开其值的类型。事实上,这里还涉及到另一层抽象。因此,我的方法具体定义如下:
export interface IDictionary<T = any> {
[key: string]: T;
}
public async pushKey<K extends keyof T, KK extends keyof K>(property: K, value: K[KK]) { ... }
public-async-pushKey(属性:K,值:K[KK]){…}
因此,类型T
是在类级别定义的,是一组属性,可以是“按键”。此方法适用于“按键”属性,因此也是具有字符串键和值的对象,可以作为任何数据结构进行约束。为了简单起见,我们可以假设它总是IDictionary
结构,因为这显然是一个有效的用例
我本以为上面的签名会让我得到我想要的东西,但对于属性T[K]——它实际上是一个IDictionary
——我从vs code获得以下类型信息:
有人能帮忙吗?问题是
KK
的类型查询索引到K
,这是一个字符串
,因此值
的类型将始终是字符串
的所有属性的并集。根据您的描述,您希望KK
成为属性类型T[K]
class dd<T> {
public async pushKey<K extends keyof T, KK extends keyof T[K]>(property: K, value: T[K][KK]) { ... }
}
declare let d:dd<{
prop: IDictionary<string>
}>;
d.pushKey("prop", "dd") // ok
d.pushKey("prop", 1) //error, not a value for prop
因此,在您的示例中,值的类型应为
string
?如果你有一个IDictionary
,它应该是number
?是的,没错