【问题标题】:Typescript function complain parameter type not assignable when added multiple types添加多种类型时,Typescript函数抱怨参数类型不可分配
【发布时间】:2021-03-03 16:27:13
【问题描述】:

我有一个非常简单的函数:

function foo<T>(input: T, def: T) : T {
    return !!input ? input : def;
}

这么叫

foo(6, 7);
foo("h", "i")

没问题。

现在如果我改成

function foo<T>(input: T | null | undefined, def: T) : T {
    return !!input ? input : def;
}

我收到类似“类型 '6' 的参数不能分配给类型 '7 | null | undefined' 的参数。”和“类型 '“h”' 的参数这样的错误不能分配给“i”| null | undefined'类型的参数。

但如果我这样称呼它

const h: string = "h";
const i: string = "i";
foo(h, i);

那么就OK了。

这是为什么呢?

【问题讨论】:

标签: typescript


【解决方案1】:

是的,它似乎只在早期版本上?

是的,确切地说是 3.5.1 及以下版本Link

在这个例子中:

function foo<T>(input: T | null | undefined, def: T) : T {
    return !!input ? input : def;
}

foo(6, 7);
foo("h", "i");

泛型参数始终是第二个参数的字面量,这就是引发错误的原因。

在以后的版本中,null | undefined 不再影响泛型参数。

【讨论】:

  • 谢谢。您能否还补充一下为什么首先声明参数有效(我的最后一个示例)?
  • @user1589188 这纯粹是猜测,因为我还没有找到它的 github 问题,但似乎 typescript 在该版本中推断正确的类型参数时遇到了问题。显式声明类型意味着 typescript 不必推断类型本身。
  • 我猜 Typescript 足够聪明,可以确定!!input 触发nullundefined,因此input 不能是其中之一。因此input 必须是T。他们(TS 帮派)如何解决这个问题超出了我的理解。
猜你喜欢
  • 1970-01-01
  • 2013-11-03
  • 2015-07-02
  • 1970-01-01
  • 2020-06-09
  • 2021-10-17
  • 2020-03-26
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多