typescript 返回类型约束

function parse<T>(list: string | any[]) {
   // do something
}

有上面这么一个函数,用于解析字符串,可以接收一个字符串或者数组,如果输入的是字符串, 给定T类型作为返回类型,如果不是字符串,则返回传入参数的类型(数组), 这样的约束应该怎么实现

阅读 3.8k
2 个回答

可以使用函数签名重载的方式:

function parse<T>(list: string): T;
function parse<T>(list: T): T;
function parse(list) {
    // 具体实现
    return list
}
let str = parse<Object>("123")  // str: Object
let numList = parse([1, 2, 3])  // numList: number[]
let strList = parse(["1", "2", "3"])    //strList: string[]

你的需求是通过输入参数的类型来决定返回值类型,这个需求是无法实现的,因为ts的类型检查都是静态类型,只作用于ts编译阶段。

通过给定泛型T来指定返回值类型是没有意义的,你的函数功能是进行字符串处理,那么返回的类型应该是固定的,或者跟随输入的参数类型(string或any[])

你可以换个思路,我们应该在调用的时候尽可能知道传入参数的类型,这样就可以使用T来标记参数与返回类型,如:

function parse<T>(list: T): T {
   // do something
}

如果说不能确定传入的是字符串还是数组,那就加入一些逻辑进行处理,将返回结果统一成string或者any[]

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题