打字稿索引签名

时间:2018-06-13 11:36:46

标签: typescript

我希望将对象的可分配类型限制为特定类型。例如,所有键必须具有number值的对象,如下所示:

interface NumberMap {
    [key: string]: number;
}

这适用于强制执行值限制,但我无法确定map变量中实际存在哪些键。

const map: NumberMap = {
  one: 1,
  two: 2,
  three: 3,
};

// no error, but incorrect, this key does *not* exist
const lol = map.weoiroweiroew;

// Also cannot do this
type MyKeys = keyof map;

有没有办法强制执行索引签名而不会丢失实现该签名的对象的哪些键信息?

2 个答案:

答案 0 :(得分:1)

同时执行限制值以及保留有关实际类型中实际键的键的类型信息的唯一方法是使用通用辅助函数。该函数将强制对象文字扩展接口,但它将推断对象文字的实际类型:

interface NumberMap {
    [key: string]: number;
}

function createNumberMap<T extends NumberMap>(v: T) {
    return v;
}
const map = createNumberMap({
    one: 1,
    two: 2,
    three: 3,
    // no: '' // error
});
map.one //ok
map.no //error

答案 1 :(得分:0)

这个怎么样?我认为这会将您的对象键限制为给定的3个索引

type Index = 'one' | 'two' | 'three'
type NumberMap = { [k in Index]?: number }