我正在编写一个小实用函数,用于从字符串或数组中删除指定数量的元素.我希望编译器能够根据传递给函数的内容来推断返回值是字符串还是array.有办法做到这一点吗?

function shave<T>(iterable: string | T[], n: number) {
  return n > 0 ? iterable.slice(0, iterable.length - n) : iterable.slice(n * -1)
}

推荐答案

TypeScrip支持函数重载,允许为同一函数指定多个类型签名.

通过将这些签名放在函数本身之前来创建重载:

function shave<T>(s: T[], n:number): T[]
function shave(s: string, n:number): string
function shave<T>(iterable: string | T[], n: number) {
  return n > 0 ? iterable.slice(0, iterable.length - n) : iterable.slice(n * -1)
}

使用这些重载,编译器会推断出您所期望的类型:

const s = shave("abc", 2) // string
const a = shave([1,2,3], 2) // number[]

Typescript相关问答推荐

从接口创建类型安全的嵌套 struct

接口的额外属性作为同一接口的方法的参数类型'

Redux—Toolkit查询仅在不为空的情况下添加参数

具有继承的基于类的react 组件:呈现不能分配给基类型中的相同属性

如何使用Zod使一个基于其他字段值的字段为必填字段?

使用axios在ngOnInit中初始化列表

如何在typescript中设置对象分配时的键类型和值类型

Express Yup显示所有字段的所有错误

如何判断对象是否有重叠的叶子并产生有用的错误消息

如何编辑切片器以使用CRUD调用函数?

为什么我的函数arg得到类型为Never?

如何在Type脚本中创建一个只接受两个对象之间具有相同值类型的键的接口?

如何提取具有索引签名的类型中定义的键

基于参数的 TS 返回类型

我可以在 Typescript 中重用函数声明吗?

Typescript 子类继承的方法允许参数中未定义的键

元素隐式具有any类型,因为string类型的表达式不能用于索引类型{Categories: Element;管理员:元素; }'

如何确定单元格中的块对 mat-h​​eader-cell 的粘附(粘性)?

React router - 如何处理嵌套路由?

基于泛型的柯里化函数的条件参数