我想编写一个函数valueToObject
,给定一个键和一个值,产生一个具有该键和值的对象,例如:
valueToObject('myKey', 3);
// should return {myKey: 3}
我尝试了以下代码:
type Wrapped<K extends string, V> = {
[P in K]: V;
};
function valueToObject<K extends string, V>(key: K, value: V): Wrapped<K, V> {
return {[key]: value};
}
但这不会编译,除非我将返回值强制转换为any
:
error TS2322: Type '{ [x: string]: V; }' is not assignable to type 'Wrapped<K, V>'.
如何以类型安全的方式编写此函数?
答案 0 :(得分:3)
使用计算属性时,带有泛型参数的类型将被推断为{ [name: string]: V }
。这似乎与this问题有关,尽管已将其标记为已修复,但您可以在4天前看到@jcalz评论说2.9仍在发生这种情况。
编辑 This问题似乎非常接近,并且仍处于目标3.0的状态,因此我们可能会尽快修复。
唯一的解决方法是使用类型断言:
function valueToObject<K extends string, V>(key: K, value: V): Wrapped<K, V> {
return { [key]: value } as Wrapped<K, V>;
}
//OR
function valueToObject<K extends string, V>(key: K, value: V): Wrapped<K, V> {
var result = {} as Wrapped<K, V>
result[key] = value;
return result;
}
我建议您在GitHub上报告此问题,或者对问题发表评论,以引起人们注意这种情况仍然会发生的事实。