typescript的泛型问题?

新手上路,请多包涵
//想通过泛型自定义返回参数,例如<number> 返回参数为number
//问题: 我要怎么操作return 是T类型不会报错
function demo<T>(arr: string): T {

  return 
}
console.log(demo<number>('123'));
阅读 1.7k
1 个回答

一般在不知道 T 的类型的情况下,内部可能也不知道怎么去处理 s,一个常用的做法,是传入一个转换函数,由这个函数来返回类型为 T 的结果

Playground

function demo<T>(s: string, fn: (s: string) => T): T {
  return fn(s)
}
const a = demo('123', (s) => Number(s)) // a 为 number

或者如果是需要根据参数去返回对应的类型,则最好是写成重载函数

Playground

function demo(s: string, type: 'number'): number
function demo(s: string, type: 'string'): string
function demo(s: string, type: 'number' | 'string') {
  switch (type) {
    case 'number':
      return Number(s)
    case 'string':
      return s
  }
}
const a = demo('123', 'number') // a 为 number

当然如果非要直接在内部去返回 T 的话,可以通过 类型断言 来实现的,具体就是用 as 关键字将某个变量强行断言成 T 然后返回。

但非常不推荐这样写,因为有可能造成 T 的类型和真实返回的类型不一致,但类型系统中却捕捉不到这个问题,导致后续使用错误的类型而无法得到预期的结果。

function demo<T>(s: string): T {
  let res
  // 其他处理
  return res as T
}
console.log(demo<number>('123'))
logo
Microsoft
子站问答
访问
宣传栏