我想写一个函数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>'.
如何以类型安全的方式编写这个函数?
当使用计算属性时,带有泛型参数的类型将被推断为{ [name: string]: V }
。这似乎与this https://github.com/Microsoft/TypeScript/issues/14473#issuecomment-287053561问题,虽然已标记为已修复,但您可以看到 @jcalz 大约 4 天前评论说这个问题在 2.9 上仍然发生。
Edit This https://github.com/Microsoft/TypeScript/issues/13948该问题似乎是一场势均力敌的比赛,并且仍然处于开放状态,目标为 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 上报告此问题,或对此问题发表评论,以引起人们对这种情况仍然发生的事实的关注。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)