我想做一个既能接收string | undefined又能返回string | undefined的函数.这是我的第一个方法:

sanitizeName: (name: string | undefined): string | undefined => {
  return name?.replace(...)
},

但是,当我使用字符串参数调用此函数时,我知道它肯定也会返回string,但现在类型是string | undefined,我需要额外的存在判断.

我try 的是赋值为string | undefined的泛型T,它是参数和返回类型:

sanitizeName: <T extends string | undefined>(name: T): T => {
  return name?.replace(...)
},

在我看来,这应该是可行的:如果函数收到UNDEFINED,它就会返回UNDEFINED.如果它接收到字符串,则返回一个字符串.

但我得到了这样的错误:

Type 'string | undefined' is not assignable to type 'T'.
  'string | undefined' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'string | undefined'.
    Type 'undefined' is not assignable to type 'T'.
      'undefined' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'string | undefined'.ts(2322)

为什么会这样呢?我如何才能获得所需的行为(string返回string,undefined返回undefined)?

推荐答案

我不得不构建一个类似的函数,似乎TypeScrip不能以这种方式推断T的子类型,所以我不得不这样做:

function sanitizeName(name: string): string;
function sanitizeName(name: undefined): undefined;
function sanitizeName(name: string | undefined): string | undefined {
  return ...
}

了解有关函数重载的更多here个信息

Typescript相关问答推荐

与Prettify助手类型中的对象相交?

Typescript如何从字符串中提取多个文本

相同端点具有不同响应时的RTKQuery类型定义

带有联合参数的静态大小数组

如何在方法中定义TypeScript返回类型,以根据参数化类型推断变量的存在?

使某些类型的字段变为可选字段'

在泛型类型中对子代执行递归时出错

基于键的值的打字动态类型;种类;

对扩展某种类型的属性子集进行操作的函数

在不更改类型签名的情况下在数组并集上映射文字

Material UI / MUI系统:我如何告诉TypeScript主题是由提供程序传递的?

如何使我的函数专门针对联合标记?

TypeScrip-根据一个参数值验证另一个参数值

如何从接口中省略接口

Angular NG8001错误.组件只能在一个页面上工作,而不是在她的页面上工作

在REACT查询中获取未定义的isLoading态

有没有一种更好的方法来存储内存中的数据,而不是在类型脚本中使用数组和基于索引的函数?

基于泛型的类型脚本修改类型

组件使用forwardRef类型脚本时传递props

如何从联合类型推断函数参数?