【问题标题】:Typescript index signatures打字稿索引签名
【发布时间】:2020-08-06 03:06:57
【问题描述】:

我希望将对象的可分配类型限制为特定类型。例如,所有键都必须具有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;

有没有办法在不丢失实现该签名的对象所具有的密钥信息的情况下强制执行索引签名?

【问题讨论】:

  • 我在编译时而不是运行时需要密钥
  • 您的评论没有回答我的问题。如果我这样做,则没有价值限制。
  • @JonasLochmann 他想确保对象文字的类型扩展了接口,但也获得了对象文字的实际类型

标签: typescript


【解决方案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

【讨论】:

  • 啊,是的,忘了那个技巧 :) 没有办法使用辅助函数吗?
  • @EdwardSammutAlessi 据我所知,至少没有简单的方法。有一种方法需要你声明一个额外的类型来执行验证,但我不会真的推荐它
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2018-12-15
    • 2019-11-14
    • 2021-05-20
    • 2019-09-21
    相关资源
    最近更新 更多