Typescript 基于泛型类型中键值的类型约束键

Typescript 基于泛型类型中键值的类型约束键,typescript,typescript-generics,Typescript,Typescript Generics,我试图编写一个泛型函数,其中泛型类型用于键入其参数 以下是此参数的一部分: 类型配置={ 主数据:T[], 目标:???? } 键入target属性时遇到问题。我希望它是特定类(MtmFormComponent,当前类)中任何属性的名称,但约束条件是属性的类型为T[] 我的目标是编写:this[configuration.target]=configuration.masterdata 我已经走到一半了。以下是我目前如何键入target: type MtmFormComponentProper

我试图编写一个泛型函数,其中泛型类型用于键入其参数

以下是此参数的一部分:

类型配置={
主数据:T[],
目标:????
}
键入
target
属性时遇到问题。我希望它是特定类(
MtmFormComponent
,当前类)中任何属性的名称,但约束条件是属性的类型为
T[]

我的目标是编写:
this[configuration.target]=configuration.masterdata

我已经走到一半了。以下是我目前如何键入
target

type MtmFormComponentPropertyOfType=MtmFormComponent[K]扩展了T[]?K:从来没有;
类型DropdownAutocompleteConfiguration={
主数据:T[],
targetFilteredList:MtmFormComponentPropertyOfType,
};
声明类型为
DropdownAutocompleteConfiguration
的对象时,一切正常,IDE的自动完成正确地约束我只使用一个键,该键导致与
主数据的值类型相同。所以我的类型似乎定义正确

我的问题是在泛型函数中使用该对象时:

private setupDropDownAutoCompleteTebehaviour(配置:DropdownAutocompleteConfiguration):无效{
此[configuration.targetFilteredList]=configuration.masterdata;
// ...
}
这里,
this[configuration.targetFilteredList]
表达式给出以下错误:

类型“T[]”不可分配给类型“this[Currency[]extensed T[]?“filteredCurrencyList”:never]&this[PriceUnit[]extensed T[]?“filteredPriceUnits”:never]&this[Subscription[]extensed T[]?“subscriptions”:never]。
类型“T[]”不可分配给类型“this[Currency[]extensed T[]?“filteredCurrencyList”:never]。
类型“T[]”不能分配给类型“Currency[]”。
类型“T”不可分配给类型“Currency”

据我所知,在函数内部,TypeScript完全解析了
这个[configuration.targetFilteredList]
的类型,而不是依赖于它是
T[]
。从IDE的自动完成功能中,我确信我不能为
target
设置一个值,这将导致类型与
主数据的类型不兼容

我不知道接下来该怎么办:/


感谢您的帮助:)

在这种特殊情况下,您是否必须使函数在目标属性键上通用

为了给出一个具体的例子,假设
MtmFormComponent
的定义如下

接口MtmFormComponent{
foo:string[];
条:字符串[];
baz:编号[];
qux:字符串;
}
现在,我们需要一个类型,它为我们提供一个类型
T
的所有属性名称,其中属性名称映射到一个
U[]
的值。我们可以这样定义此类型:

type ArrayValuedProps={[K in keyof T]:(T[K]扩展U[]?K:never)}[keyof T]
这样,我们就可以

ArrayValuedProps<MtmFormComponent, string> = { foo: "foo"; bar: "bar"; baz: never; qux: never }[keyof MtmFormComponent]
                                           = { foo: "foo"; bar: "bar"; baz: never; qux: never }["foo" | "bar" | "baz" | "qux"]
                                           = "foo" | "bar" | never
                                           = "foo" | "bar"
我们完全可以避免将目标键作为类型参数