首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型标索引签名

类型标索引签名
EN

Stack Overflow用户
提问于 2018-06-13 11:36:45
回答 2查看 4.1K关注 0票数 9

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

代码语言:javascript
复制
interface NumberMap {
    [key: string]: number;
}

这对于强制执行值限制是有效的,但是这样我就无法确定map变量中实际存在哪些键。

代码语言:javascript
复制
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;

是否有一种在不丢失实现该签名的对象具有哪些密钥的情况下强制执行索引签名的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-13 11:41:08

这两种限制值以及保存有关实现类型中的键的类型信息的唯一方法是使用泛型助手函数。函数将强制对象文字扩展接口,但它将推断对象文字的实际类型:

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2020-08-05 19:06:57

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

代码语言:javascript
复制
type Index = 'one' | 'two' | 'three'
type NumberMap = { [k in Index]?: number }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50836259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档