通过类型安全的方式将键和值转换为具有单个键/值的对象

时间:2018-06-19 13:30:04

标签: typescript

我想编写一个函数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>'.

如何以类型安全的方式编写此函数?

1 个答案:

答案 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上报告此问题,或者对问题发表评论,以引起人们注意这种情况仍然会发生的事实。