我有一个IDictionary<string>
类型的属性,其中字典定义为:
export interface IDictionary<T = any> {
[key: string]: T;
}
我想定义一个方法,将类型约束为&#34; string&#34;在这种情况下。基本上它打开字典并公开它的类型值。现在,事实上,这里涉及另一层抽象。所以具体来说我的方法定义为:
public async pushKey<K extends keyof T, KK extends keyof K>(property: K, value: K[KK]) { ... }
所以这里,类型T
是在类级别定义的,是一组属性,可以是&#34; push key&#34;。此方法适用于 a&#34; pushKey&#34;因此,它也是一个具有字符串键和值的对象,它们可以被约束为任何数据结构。为简单起见,我们可以假设它始终是IDictionary<string>
结构,因为它显然是一个有效的用例。
我原本以为上面的签名会让我得到我想要的东西,但对于属性T [K] - 这确实是IDictionary<string>
- 我从vs-获得以下类型信息代码:
有人可以帮忙吗?
答案 0 :(得分:1)
问题是KK
的类型查询索引到K
string
,因此value
的类型将始终是所有属性的并集string
。根据您的说明,您希望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
虽然你实际上并没有在任何其他类型的容量中使用KK
,但它永远不会被限制在比keyof T[K]
更具体的任何东西,所以你可以在没有KK
的情况下达到同样的效果}:
public async pushKey<K extends keyof T>(property: K, value: T[K][keyof T[K]]) { ... }