在Typescript中使用具有约束的泛型类型时出错-2536

时间:2019-01-30 12:20:22

标签: typescript

我有以下几种类型:

interface IFilterField <T extends FilterFieldValue > {
    defaultValue: T
    displayStr?: string
}

interface IFilterFields = {
   costMax: IFilterField<number>
   costMin: IFilterField<number>
   .....
}>

当我尝试键入将在filterField及其值的类型之间链接的对象时,此方法有效:

export type IFiltersState<FiltersKeys extends keyof IFilterFields> = {
    [K in keyof FiltersKeys]: IFilterFields["costMin"|"costMax"]["defaultValue"]

}

但这失败了:

export type IFiltersState<FiltersKeys extends keyof IFilterFields> = {
   [K in keyof FiltersKeys]: IFilterFields[K]["defaultValue"]
}

即使约束条件几乎相同。

错误:

[ts] Type 'K' cannot be used to index type 'IFilterFields'. [2536]
[ts] Type '"defaultValue"' cannot be used to index type 'IFilterFields[K]'. [2536]

为什么会出现此错误?

我如何达到遵循以下原则的映射类型的目的:新类型T2具有一些类型为T1的键,并且对于每个这样的键,typeof T1 [key]等于typeof T2 [key] [SomeFieldName ]?

2 个答案:

答案 0 :(得分:1)

因为FiltersKeys是从IFilterFields扩展的,所以它可能包含不同的键。您可以使用

export type IFiltersState<FiltersKeys extends keyof IFilterFields> = {
    [K in keyof IFilterFields]: IFilterFields[K]["defaultValue"]
}

答案 1 :(得分:1)

我发现了我的错误。由于FiltersKeys已经是键/字符串的并集,因此[K in keyof IfilterFields]中有一个redundand keyof。

相关问题