繁体   English   中英

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

[英]How to define generic function with one concrete type and one inferred type

我有一个带有两个类型参数的通用函数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)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM