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