Dato un tipo letterale , ad esempio 1 | 2
, l'assegnazione di un valore a una variabile che corrisponde correttamente al tipo letterale avrà esito negativo.
interface SomeInterface {
foo: (1 | 2);
}
class SomeClass implements SomeInterface {
foo = 1; // <- generates the following compiler error:
/*
Property 'foo' in type 'SomeClass' is not assignable to the same
property in base type 'SomeInterface'.
Type 'number' is not assignable to type '1 | 2'.
*/
}
Tuttavia, dichiarare esplicitamente il tipo letterale soddisferà il compilatore.
interface SomeInterface {
foo: (1 | 2);
}
class SomeClass implements SomeInterface {
foo: (1 | 2) = 1; // <- no error
}
È possibile utilizzare anche l'asserzione di tipo:
foo = 1 as (1 | 2); // <- no error
// or
foo = <1 | 2>1; // <- no error
Per i tipi primitivi, dovrebbe essere banale per il compilatore sapere che il valore 1
è di tipo (1 | 2)
(diamine, anche solo di tipo (1)
!). Esiste un motivo di progettazione per cui il compilatore di TypeScript non deduce implicitamente i tipi letterali dai valori letterali?