在打字稿中展开类型

时间:2018-04-04 18:59:11

标签: typescript

我有一个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-获得以下类型信息代码:

enter image description here

有人可以帮忙吗?

1 个答案:

答案 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]]) { ... }