如何在typescript中正确键入addField(obj,name,value)



假设我有一个函数

function addField(obj, name, value) {
return { ...obj, [name]: value }
}

我如何用打字机打字?编辑:我的返回类型有问题。我希望它是";原始的CCD_ 1但是其中具有这一个CCD_;。

我希望这能奏效,但不幸的是没有:

function addField<T, V>(obj: T, name: string, value: V): T & { `${name}`: V } {
return { ...obj, [name]: value }
}

(它抱怨name是一个值而不是一个类型(。所以,一种有效的黑客是

// Hope that nameVal has only one key
function addField<T, V, N extends { [K: string]: V }>(
obj: T,
nameVal: N
): T & { [K in keyof N]: V } {
return { ...obj, ...nameVal };
}

但这仍然不是我想要的100%(因为它允许添加多个字段(,而且也不是很好。有没有更好的方法可以动态地向对象添加字段并将其编码到类型系统中?

编辑2:我想我可以使用它来禁止具有多个键的对象,但无论如何我都希望保留原始的addField(obj, name, value)

这是我经常遇到的一个常见问题。简单地说,TypeScript IntelliSense并不完美,微软也知道这一点。因此,TypeScript可以键入as unknown as [your type],但要小心,这不像在CSS中使用!important那样是好的做法。所以回到你的问题,你可以简单地使用技巧:

function addField<T, V, N extends string>(object: T, name: N, value: V) {
return {
...object,
[name]: value
} as unknown as T & {
[K in N]: V
};
}

它运行良好:IntelliSense

最新更新