類型系統中打字稿不允許你指定與非指定鍵指定數目的一個類型。實際上,由於它缺少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