Typescript 泛型函数中的属性类型

Typescript 泛型函数中的属性类型,typescript,generics,types,Typescript,Generics,Types,我试图通过提供字段名来转换对象的一些字段,目前我写了如下内容: 接口Foo{ a:编号[], b:字符串[], } 类型Bar={[T in keyof Foo]:(arg:Foo[T])=>Foo[T]} 功能测试(字段:T){ 常量foo:foo={ a:[], b:[], }; 常数条:条={ a:arg=>/*一些代码*/[], b:arg=>/*一些代码*/[], }; foo[field]=bar[field](foo[field]); } 但我在栏[field](foo[fiel

我试图通过提供字段名来转换对象的一些字段,目前我写了如下内容:

接口Foo{
a:编号[],
b:字符串[],
}
类型Bar={[T in keyof Foo]:(arg:Foo[T])=>Foo[T]}
功能测试(字段:T){
常量foo:foo={
a:[],
b:[],
};
常数条:条={
a:arg=>/*一些代码*/[],
b:arg=>/*一些代码*/[],
};
foo[field]=bar[field](foo[field]);
}
但我在
栏[field](foo[field])
上出现以下错误消息:


但是typescript不应该“知道”使用相同的
t
Foo[t]
参数应该是相同的吗?

也许编译器应该知道,但它不知道。我倾向于称这个问题为“相关类型”或“相关记录”。编译器将
foo[field]
bar[field]
视为联合类型的东西,这是正确的。但它将它们的类型视为独立的,这意味着据它所知,
foo[field]
可能是
number[]
,而
bar[field]
可能是一个接受
string[]
的函数。它看不出
foo[field]
的类型与
bar[field]
的类型之间的关联方式是知道一个可以修复另一个。有一个悬而未决的问题,(我提交了,fwiw)建议对相关类型有一些支持,但不清楚这是否会发生或如何发生

我们现在只有一些变通办法。该问题中提到的两种解决方法:要么使用冗余代码强制编译器遍历不同的可能性并保证类型安全,要么使用放弃某些类型安全,但保持简洁。对于您的代码,它将如下所示:

// redundant code
const f: keyof Foo = field;
switch (f) {
   case "a":
      foo[f] = bar[f](foo[f]);
      break;
   case "b":
      foo[f] = bar[f](foo[f]);
      break;
}

// type assertion
foo[field] = (bar[field] as <T>(arg: T) => T)(foo[field]);
//冗余代码
常数f:keyof Foo=字段;
开关(f){
案例“a”:
foo[f]=bar[f](foo[f]);
打破
案例“b”:
foo[f]=bar[f](foo[f]);
打破
}
//类型断言
foo[field]=(条形图[field]as(arg:T)=>T)(foo[field]);
我通常选择类型断言。好吧,希望这会有帮助;祝你好运

可能重复的可能重复的
// redundant code
const f: keyof Foo = field;
switch (f) {
   case "a":
      foo[f] = bar[f](foo[f]);
      break;
   case "b":
      foo[f] = bar[f](foo[f]);
      break;
}

// type assertion
foo[field] = (bar[field] as <T>(arg: T) => T)(foo[field]);