【问题标题】:Why 'null' or 'undefined' "is assignable" to parameter of type 'string'?为什么“空”或“未定义”“可分配”给“字符串”类型的参数?
【发布时间】:2021-01-10 14:30:53
【问题描述】:

我们来the following code in TypeScript:

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

f("a", 1);

TypeScript 预计会失败:

“数字”类型的参数不能分配给“字符串”类型的参数。

但是,when I pass null (or undefined) instead of 1,TypeScript 将泛型参数 &lt;T&gt; 的类型更改为 string | null 并且不会失败。

我有两个问题:

  • 为什么nullundefined 的处理方式不同于例如number?
  • 以及如何防止扩大(将类型更改为string | null)?

【问题讨论】:

  • TypeScript 正在推断联合类型 string | null,因为 ab 都是同样适用于 T 的推断站点。如果a的类型应该依赖于b的类型,那么你可以写function f&lt;T, U extends T&gt;(a: T, b: U) { }。我知道这不是你的问题。

标签: typescript typescript-generics


【解决方案1】:

为什么 null 或 undefined 的处理方式不同于例如号码?

说实话,我不是 100% 确定原因。正如在 cmets 中提到的,它推断 a 是“字符串”类型,但允许 `null |不明确的。我做了一些实验,但我不知道为什么会这样。

以及如何防止扩大(将类型更改为字符串| null)? 您可以做的一些示例:

// 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 2021-09-14
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多