如何用一种具体类型和一种推断类型定义泛型函数

时间:2019-07-28 18:01:53

标签: typescript types typescript-generics

我有一个泛型函数transform(),带有两个类型参数,可将类型A的参数转换为类型B

declare const transform: <A, B>(x: A) => A | B

const a = 123 //: number
const b = transform<number, string>(a) //: string

现在,我必须同时传递两种​​类型,但是可以从参数中推断出第一种类型。我想要一个只需要新类型作为具体输入的函数。

如何编写可以接受一种具体类型并推断另一种具体类型的泛型函数?


编辑1

transform()函数后面的实现并不重要。相反,我需要的是一种编写泛型函数的方式,该泛型函数可以推断一种类型(在这种情况下为参数)并接受另一种类型(返回类型)。


编辑2

我当前的替代方法是使用高阶函数(以捕获返回类型),该函数返回执行转换的另一个函数。

declare const transform: <B>() => <A>(x: A) => A | B

const a = 123 //: number
const b = transform<string>()(a) //: string

编辑3

transform()添加示例实现

const transform: <A, B>(x: A) => A | B = (x) => {
  if (x === null) {
    return null
  }

  if (typeof x === 'number') {
    return x.toString() as any
  }

  return x
}

const a = transform<number, string>(123)
const b = transform<null, boolean>(null)

2 个答案:

答案 0 :(得分:1)

将其接受为any(或您希望其接受的类型的并集):

function transform<T>(x: any): T {
  return x
}

const a = 123 //: number
const b = transform<string>(a) //: string

但是,值得注意的是该函数实际上并没有改变任何东西。在您的示例中,尽管TypeScript认为b是字符串,但不是。它仍然是一个数字。您的函数在运行时根本不执行任何操作。如果您想真正进行转换,则需要在运行时进行某些操作以使其实现。您的编辑建议您知道这一点。 :-)

答案 1 :(得分:0)

由于您实际上并不关心x的类型,因此您无法为其指定类型参数。

function transform<T>(x: any): T { return x as any; }

然后可以像调用它一样

const a = 123;
const b = transform<string>(a);