首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何限制索引类型的可能值?

如何限制索引类型的可能值?
EN

Stack Overflow用户
提问于 2021-09-27 09:08:42
回答 1查看 338关注 0票数 1

我们可以声明index signature来强制对象的属性是特定类型的,如下所示

代码语言:javascript
复制
const LOOKUP: {
  [key: string]: { name: string, age: number };
} = {
  isaac: { name: 'isaac', age: 20 },
  whatever: {name: 'whatever', age: 17}
};

但是,我想限制作为key的可能值,下面是我的尝试

尝试1

代码语言:javascript
复制
type PossibleName = 'isaac' | 'john';

const LOOKUP: {
  [key: PossibleName]: { name: string, age: number };
} = {
  isaac: { name: 'isaac', age: 20 },
  whatever: {name: 'whatever', age: 17}
};

低于击球误差的尝试

索引签名参数类型不能是文字类型或泛型类型。考虑使用映射的对象类型。

尝试2

代码语言:javascript
复制
type PossibleName = 'isaac' | 'john';

const LOOKUP: {
  [key in PossibleName]: { name: string, age: number };
} = {
  isaac: { name: 'isaac', age: 20 },
};

而第二次尝试是在下面的错误。

属性'john‘在类型'{萨克:{ name:{ string;age: number;};}’中缺少,但在类型'{萨克:{string:{ string;age: number;};};john:{ name: string;age: number;};}‘

我可以通过使键可选来解决这个问题,如下所示

代码语言:javascript
复制
type PossibleName = 'isaac' | 'john';

const LOOKUP: {
  [key in PossibleName]?: { name: string, age: number };
} = {
  isaac: undefined,
};

它允许不声明john,但同时允许isaac & john的值undefined,这不是我想要的。

我的目标是,如果我定义了isaac,或者john,值不应该是接受undefined,而是必须是{ name: string, age: number}类型的,不知道这是否可能?

EN

回答 1

Stack Overflow用户

发布于 2021-09-27 09:41:41

代码语言:javascript
复制
type PossibleName = 'isaac' | 'john';
type Person = { name: string }
type MyType = {
  [K in PossibleName]: { [k in K]: Person }
}[PossibleName] | { [K in PossibleName]: Person }

不漂亮,只是想办法滥用TS引擎。这将产生{john: Person} | {isaac: Person}| {isaac: Person; john: Person}

游乐场

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69344052

复制
相关文章

相似问题

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