【发布时间】:2021-08-10 12:53:57
【问题描述】:
我正在尝试编写一个泛型函数,其中泛型类型用于键入其参数。
这是这个参数的一部分:
type Configuration<T> = {
masterdata: T[],
target: ????
}
我在输入 target 属性时遇到问题。我希望它是特定类(MtmFormComponent,当前类)中的任何属性的名称,但限制属性的类型是T[]。
我的目标是写:this[configuration.target] = configuration.masterdata;。
我已经完成了一半。以下是我现在输入target 的方式:
type MtmFormComponentPropertyOfType<T, K extends keyof MtmFormComponent> = MtmFormComponent[K] extends T[] ? K : never;
type DropdownAutocompleteConfiguration<T, K extends keyof MtmFormComponent> = {
masterdata: T[],
targetFilteredList: MtmFormComponentPropertyOfType<T, K>,
};
当声明 DropdownAutocompleteConfiguration 类型的对象时,一切都很好,我的 IDE 的自动完成正确地限制我只使用导致与 masterdata 的值相同类型的键。所以我的类型似乎被正确定义了。
我的问题是在我的通用函数中使用该对象时:
private setupDropdownAutocompleteBehaviour<T, K extends keyof MtmFormComponent>(configuration: DropdownAutocompleteConfiguration<T, K>): void {
this[configuration.targetFilteredList] = configuration.masterdata;
// ...
}
这里,this[configuration.targetFilteredList] 表达式给出以下错误:
类型 'T[]' 不能分配给类型 'this[Currency[] extends T[] ? "filteredCurrencyList" : never] & this[PriceUnit[] extends T[] ? "filteredPriceUnits" : never] & this[Subscription[] extends T[] ? “订阅”:从不]'。
类型 'T[]' 不能分配给类型 'this[Currency[] extends T[] ? “filteredCurrencyList”:从不]'。
类型“T[]”不可分配给类型“Currency[]”。
类型“T”不能分配给类型“货币”。
据我了解,在函数内部,TypeScript 完全解析了this[configuration.targetFilteredList] 的类型,而不是依赖于它是T[] 的事实。从我的 IDE 的自动完成功能来看,我确信我不能为 target 设置值,这会导致类型与 masterdata 不兼容。
我不知道从那里做什么:/
感谢您的帮助:)
【问题讨论】:
标签: typescript typescript-generics