【问题标题】:Error when using a generic type with a constraint in Typescript - 2536在 Typescript 中使用带有约束的泛型类型时出错 - 2536
【发布时间】:2019-01-30 12:20:22
【问题描述】:

我有以下几种:

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 ]?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    由于 FiltersKeys 是从 IFilterFields 扩展而来的,因此它可以包含不同的键。你可以使用

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

    【讨论】:

      【解决方案2】:

      我发现了我的错误。由于FiltersKeys 已经是键/字符串的联合,所以[K in keyof IfilterFields] 中有一个多余的keyof。

      【讨论】:

      • 我应该完全删除这个问题吗?
      猜你喜欢
      • 2019-06-27
      • 2012-06-29
      • 2018-03-05
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2017-01-21
      • 2020-05-30
      相关资源
      最近更新 更多