类型系统中打字稿不允许你指定与非指定键指定数目的一个类型。实际上,由于它缺少exact types,因此TypeScript实际上并不允许您指定具有指定数字键的类型,也可以指定键。它只对对象文字进行多余的属性检查。作为一种类型,是这样的:
type Person = {
age: number,
gender: 'M' | 'F' | 'O'
}
并不意味着Person
不能有其他的按键,如:
const pirate = {
age: 35,
gender: 'M' as 'M',
legs: 1,
parrot: true
};
const piratesArePeopleToo: Person = pirate; // no problem
所以最你能希望将是打字稿抱怨,如果你通过一个对象文字太多的键,如在:
const otherPirate: Person = {
age: 40,
gender: 'F',
eyes: 1,
parrot: false
}; // error
而且,不,TypeScript不会让你表达这种约束,据我所知。
我能想到的将是一个解决办法的最好:创造一个函数,它接受一个键和Person
,并返回你想要的类型的对象:如果您组织
type NamedPerson<K extends string> = Record<K, Person>;
function makeNamedPerson<K extends string>(key: K, person: Person): NamedPerson<K> {
let namedPerson = {} as NamedPerson<K>;
namedPerson[key]=person;
return namedPerson;
}
const namedPerson = makeNamedPerson('chris', { age: 10, gender: 'O' });
console.log(namedPerson.chris.age);
你的代码所以获得类型为NamedPerson<K>
的对象的唯一合理方法是调用函数makeNamedPerson()
(例如,仅导出函数并使其类型与private
成员生成类),然后您知道每个函数都会有一个单键。这对于你来说不如被类型系统强制执行,但是至少让你的库的用户难以规避约束。
希望有帮助;祝你好运!
我认为你正在试图做的是非常相似的字典正如你所提到的那样,控制键的数量是静态类型系统无法执行的运行时概念。 – Reza
'interface foo {bar:baz}'确实执行特定数量的密钥否? – Renaud
它强制执行特定数量的键并且强制执行只有名为'bar'的类型为'baz'的字段。你不能说“这个对象只有一个'baz'类型的字段,但我不知道这个键的名字现在是什么 ”。 – y2bd