Typescript satisface transformă tipul boolean în literal. Este normal?
În timp ce alte tipuri rămân aceleași, tipul 'boolean' devine literal 'false' după ce satisface "TypesSamples"
interface TypesSamples {
str: string;
int: number;
arr: Array<any>;
bool: boolean;
}
const types = {
str: "a",
int: 0,
arr: [1],
bool: false,
} satisfies TypesSamples; // satisfies here
types.str = "abc";
types.int = 1000;
types.arr = [2, 3];
types.bool = true; // Type 'true' is not assignable to type 'false'.
Este acesta un comportament așteptat sau o problemă?
Răspuns #1
Acesta este comportamentul așteptat, așa cum este descris în microsoft/TypeScript#55189. Operatorul satisfies, așa cum este implementat în microsoft/TypeScript#46827, oferă un tip contextual care poate uneori să modifice comportamentul inferenței de tip. Motivul pentru care acest lucru este specific pentru boolean, spre deosebire de, să zicem, string, este că boolean este de fapt doar o prescurtare pentru tipul uniunii true | false. Chiar dacă se afișează ca un singur tip, este de fapt o uniune. Puteți verifica acest lucru definind manual un tip ca fiind true | false și veți vedea că se afișează ca boolean:
type B = true | false;
// ^? type B = boolean
Deci true atunci când este evaluat contextual de true | false rămâne true, spre deosebire de "a" atunci când este evaluat contextual de string într-o expresie satisfies, care este încă extins la string ca de obicei.
Asta este cât de aproape pot ajunge de un răspuns „oficial”, oricum, având în vedere detaliile din microsoft/TypeScript#55189. Este păcat că cererea de pull din microsoft/TypeScript#46827 nu oferă niciun detaliu în descrierea sa despre cum ar trebui să funcționeze exact. Există alte părți ale TypeScript unde oferirea unui context string/number pentru un literal va rezulta într-un tip literal, și asta nu se întâmplă aici, cu excepția boolean. Tipul boolean diferă de celelalte prin faptul că este o uniune explicită, așa că nu este prea surprinzător că comportamentul său ar fi diferit, dar dacă acest lucru este cu adevărat intenționat sau doar un artefact al implementării, este imposibil pentru mine să spun cu certitudine.
Link de teren de joacă către cod
