任何人都可以在TypeScript(2.4.1)中解釋以下行爲嗎?TypeScript中的奇怪聯合類型行爲
場景:我有一個可能是「紅色」或「紅色和圓形」(修改)的按鈕。我想有以下語法來形容它:
button.mods = "red";
button.mods = ["red", "round"];
button.mods = { red: true, round: false };
來形容這一切,我用了以下接口:
interface HasMods<T extends string>{
mods: T | T[] | { [key in T]?: boolean }
}
interface Button extends HasMods<"round" | "red"> {
}
好了,現在我們可以做一些測試:
let b: Button;
b.mods = "red"; //ok, correct
b.mods = "green"; //error, correct
b.mods = ["red"]; //ok, correct
b.mods = ["green"]; //error, correct
b.mods = {red: true}; //ok, correct
b.mods = {red: true, green: true}; //error, correct
到目前爲止,一切都很完美。 但現在是個謎:
b.mods = {red: true, map: false}; //ok, why ???
爲什麼值「地圖」有效期爲我喜歡的類型的對象{[在T鍵] ?:布爾},其中T是「紅」 | 「回合」? 「地圖」既不是「紅色」,也不是「圓形」。
實際上,所有的陣列方法是有效的在這裏 - 「每一個」,「copyWithin」,等等
我相信默認情況下,typescript不會執行多餘的密鑰檢查。它只驗證對象中需要什麼。 –
爲什麼不呢?在{red:true,green:true}中,它完美地表示可以使用紅色,但綠色不能。 – dennis