Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在typescript中展开类型_Typescript - Fatal编程技术网

在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
?是的,没错