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"> {
}
[OK]を、今、私たちはいくつかのテストを行うことができます。
を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は「赤」での私のオブジェクトに対して有効なの「マップ」されます| "円形"? "map"は "red"でも "round"でもありません。実際
は、すべての配列方法は、ここで有効です - など「あらゆる」、「copyWithin」、...
falseになります私は信じていますデフォルトでは、タイトスクリプトは無関係なキーチェックをしません。それは、オブジェクトに必要なものだけを検証します。 –
どうしてですか? {red:true、green:true}では、赤は使用可能だが、緑は使用できないことを完全に識別します。 – dennis