【问题标题】:Typescript Generic vs Union打字稿通用与联合
【发布时间】:2019-10-25 15:33:53
【问题描述】:

如果我使用value: string | number 之类的参数定义函数类型,我可以定义该类型的函数(值:字符串)=> null。并且打字稿不显示任何警告。

但是如果我用泛型参数<T extends string | number>(value: T)定义函数类型,那么打字稿会显示错误。

有人能解释一下这种行为吗?

代码示例

type OnChangeUnion = (value: string | number) => void;

type OnChangeGeneric = <T extends string | number>(value: T) => void;

const handleChange = (value: string) => null;

const onChange: OnChangeGeneric = handleChange;
const onChangeA: OnChangeUnion = handleChange;

playground

【问题讨论】:

  • Tbh 如果您启用所有检查(请参阅操场上的“选项”),您会看到两个分配都失败了。
  • 它们都是错误的分配...OnChangeUnion 和 OnChangeGeneric 都是函数类型,必须接受 string | number 参数。但是handleChange 只接受string 参数,所以它既不是OnChangeUnion 也不是OnChangeGeneric。

标签: typescript


【解决方案1】:

对于通用示例,您的符号稍有偏差:

type OnChangeGeneric<T extends string | number> = (value: T) => void;
const handleChange = (value: string) => null;
const onChange: OnChangeGeneric<string> = handleChange;

Union 示例将引发实际的编译器错误(如 @zerkms 所述),因为 handleChange 只接受 string,它与 string | number 不兼容。

【讨论】:

  • 我无法判断符号是否关闭,或者 OP 是否只是对原始 OnChangeGeneric 类型应该做什么感到困惑。
猜你喜欢
  • 2021-07-03
  • 2021-11-30
  • 2019-04-18
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
  • 2018-12-06
相关资源
最近更新 更多