我正在将更好的Typescript 应用到一个项目中.有一个复杂的对象来self 的后端,它是一个具有数十个属性的类,其中大多数是它们自己的类.我们有一个带有通用更改处理程序的表单,该处理程序当前有几个any
来使其工作,但我想用泛型来修复它.
这是我的应用程序中模式的简化版本,但我能够重现我看到的相同错误:
class PhoneNumber {
prefix: number;
exchange: number;
line: number;
}
class Address {
address1: string;
address2: string;
city: string;
}
class User {
phone: PhoneNumber;
address: Address;
}
const user = new User();
function setValue<A extends keyof User, T extends User[A], K extends keyof T, V extends T[K]>(
value: V,
fieldType: new () => T,
fieldName: A,
fieldAttribute: K
) {
if (!user[fieldName]) {
user[fieldName] = new fieldType();
}
const field = user[fieldName];
// error here.
field[fieldAttribute] = value;
}
setValue(408, PhoneNumber, 'phone', 'prefix');
我try 了几种方法,这是我能找到的最接近的解决方案.我能够在我的IDE中判断末尾的函数调用,看起来泛型填充了一些合理的东西:function setValue<"phone", PhoneNumber, "prefix", number>()
,但是在编译过程中我得到了一个错误:
TS2536:类型‘K’不能用于索引类型‘USER[A]’.
我是不是走错了路?如果我不能弄清楚这一点,我最终将把不同的类型划分到单独的处理程序中.
还有一种情况是,一些字段是对象的数组,这给整个事情增加了另一条皱纹.