4 votes

Pourquoi 'null' ou 'undefined' "est assignable" à un paramètre de type 'string' ?

Prenons le code suivant en TypeScript :

function f<T>(a: T, b: T) { }

f("a", 1);

TypeScript échoue de manière attendue avec :

L'argument de type 'nombre' n'est pas assignable au paramètre de type 'chaîne'.

Cependant, quand je passe null (ou undefined ) au lieu de 1 TypeScript change le type de paramètre générique <T> a string | null et n'échoue pas.

J'ai deux questions :

  • Pourquoi null o undefined est traitée différemment de celle de e.g. number ?
  • Et comment empêcher l'élargissement (en changeant le type en string | null ) ?

2voto

David Tennant Points 98

Pourquoi null ou undefined est traité différemment d'un nombre par exemple ?

Pour être honnête, je ne sais pas vraiment pourquoi. Comme mentionné dans les commentaires, on en déduit que a est de type 'string' mais permet `null | undefined'. J'ai fait quelques expériences et je n'ai pas réussi à comprendre pourquoi il fait cela.

Et comment empêcher l'élargissement (en changeant le type en string | null) ? Quelques exemples de ce que vous pouvez faire :

// Original
function f<T>(a: T, b: T) { }

f('a', 'b')  // Allowed
f(1, 2) // Allowed
f(true, false) // Allowed
f("a", 1); // Has error
f("a", undefined); // Allowed
f("a", null); // Allowed
f(null, null) // Allowed

// Extending then defining
// Will only allow strings
function g<T extends string = string>(a: T, b: T) { }

g('a', 'b')  // Allowed
g(1, 2) // Has error
g(true, false) // Has error
g("a", 1); // Has error
g("a", undefined); // Has error
g("a", null); // Has error
g(null, null) // Has error

// Using Required
// Does not allow null or undefined but allows other non strings
function x<T>(a: Required<T>, b: Required<T>) { }

x('a', 'b') // Allowed
x(1, 2) // Allowed
x(true, false) // Allowed
x("a", 1); // Has error
x("a", undefined); // Has error
x("a", null); // Has error
x(null, null) // Has error

https://www.typescriptlang.org/play?ts=4.0. 2#code/PTAEHkCcEsHNoHYEMA2AoAZgVwQYwC7QD2CoGAPACoB8AFEgFyiUA0oARk5QJSgDeoAL5pMtAORIxbMezG9QIUAEEUKIgHcApgBNRARjYAmXopVqtujLXyQsmthlQBnTSbBmNO0QCIk3tnrcANwKYAASSE6gmpCQRJA+fmw42poYiDrBocqqnpa0vv6gCFiqWaa5FqIlqmw1KG455l5oigCiAB74mgjaiLCg+AAWPaCp6Qj9rWAA6tCqoCQoAJ6gqOagTjb9Tpg4BMSksFTRXT3aUVswCAMAvJvbN3SMzGyczLwCwmiw4pLSsnkFWaul+BlAxmyESiMTiCV+NjsDmcrihkWisXiPwKSVAgRCimhGLh2MKyV6aQy2nK4XRsKxvzJxVKDQJtJhmPhtHqdRZjSJ9IS01AAFUnP1QAAlTQARyw0EgXkUABEiJooggiPg1pVmQt4qAUpSEDoOFhtesNFEtSNIMUSA9rrBdtg8IQHR0qM8mNK5QqdF63j7ZfLFdovZ8hCIOn8pKAZHJsh4qjHwZDgXk0DHEfYyCjGsmvDGmfi0RyScXcUaJpk2aABZysziivUafW6Y2Yzy9Q0y8SsUA

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X