我有以下几种类型:
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 ]?
答案 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。