我们可以声明index signature来强制对象的属性是特定类型的,如下所示
const LOOKUP: {
[key: string]: { name: string, age: number };
} = {
isaac: { name: 'isaac', age: 20 },
whatever: {name: 'whatever', age: 17}
};但是,我想限制作为key的可能值,下面是我的尝试
尝试1
type PossibleName = 'isaac' | 'john';
const LOOKUP: {
[key: PossibleName]: { name: string, age: number };
} = {
isaac: { name: 'isaac', age: 20 },
whatever: {name: 'whatever', age: 17}
};低于击球误差的尝试
索引签名参数类型不能是文字类型或泛型类型。考虑使用映射的对象类型。
尝试2
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;};}‘
我可以通过使键可选来解决这个问题,如下所示
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}类型的,不知道这是否可能?
发布于 2021-09-27 09:41:41
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}
https://stackoverflow.com/questions/69344052
复制相似问题