如何在typescript中正确键入addField(对象、名称、值)?

如何在typescript中正确键入addField(对象、名称、值)?,typescript,types,Typescript,Types,假设我有一个函数 函数addField(对象、名称、值){ 返回{…obj[name]:value} } 如何在Typescript中键入它?编辑:返回类型有问题。我希望它是“原始的T,但其中有一个[name]属性” 我希望这能起作用,但不幸的是没有: function addField<T, V>(obj: T, name: string, value: V): T & { `${name}`: V } { return { ...obj, [name]: val

假设我有一个函数

函数addField(对象、名称、值){
返回{…obj[name]:value}
}
如何在Typescript中键入它?编辑:返回类型有问题。我希望它是“原始的
T
,但其中有一个
[name]
属性”

我希望这能起作用,但不幸的是没有:

function addField<T, V>(obj: T, name: string, value: V): T & { `${name}`: V } {
    return { ...obj, [name]: value }
}
但这仍然不是我想要的100%(因为它允许添加多个字段),而且也不是很好。有没有更好的方法动态地向对象添加字段并将其编码到类型系统中


EDIT2:我想我可以用它来禁止具有多个键的对象,但我还是想保留原始的
addField(obj,name,value)

这是我经常遇到的正常问题。简单地说,TypeScript IntelliSense并不完美,微软知道这一点。因此,TypeScript允许键入与[您的类型]一样未知的
,但要小心,这不是像用法
那样的好做法!CSS中的重要信息
。因此,回到您的问题,您可以简单地使用以下技巧:

函数addField(对象:T,名称:N,值:V){
返回{
对象
[名称]:值
}不为人知,{
[K in N]:V
};
}
它工作得很好:

您不需要返回类型,typescript可以推断它@迈克。糟糕的是,我在最上面的两个例子中有一个输入错误。我希望字段名作为参数动态提供。在这种情况下,TS不会自动推断类型(或者更确切地说,没有足够的粒度)啊,那么仅仅是?唯一的问题是,它允许重复的密钥,而这些密钥可能不在您的计算机中intention@MikeS. 我想你不小心给我发了同一份文件。我只看到
函数addField(obj:T,name:string,value:K){…}
。奇怪的是,对我来说是不同的。我将把它粘贴到这里
function addField(obj:T,value:K):T&K{return{…obj,…value};}
您不需要第三个类型参数,因为typescript应该能够根据使用情况推断它。至于多个键的事情,第二个参数将覆盖字段,这可能是你的意图,也可能不是(虽然不会重复)Díky-嗯,我的意思是,谢谢。没有我希望的那么好,但可能是目前我们能做的最好的了。只有一件事-你能解释一下为什么这里需要
未知的
?(主要针对将来阅读本文的人)因此是兼容类型(如父类和派生类)和不兼容类型(如数字和字符串)。只能对两种兼容类型使用
as
。(在一个示例中,它们是不兼容的)
any
unknown
是兼容所有类型的通配符。有关更多信息,请参阅。
// 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 };
}