我有一个泛型函数transform()
,带有两个类型参数,可将类型A
的参数转换为类型B
。
declare const transform: <A, B>(x: A) => A | B
const a = 123 //: number
const b = transform<number, string>(a) //: string
现在,我必须同时传递两种类型,但是可以从参数中推断出第一种类型。我想要一个只需要新类型作为具体输入的函数。
如何编写可以接受一种具体类型并推断另一种具体类型的泛型函数?
transform()
函数后面的实现并不重要。相反,我需要的是一种编写泛型函数的方式,该泛型函数可以推断一种类型(在这种情况下为参数)并接受另一种类型(返回类型)。
我当前的替代方法是使用高阶函数(以捕获返回类型),该函数返回执行转换的另一个函数。
declare const transform: <B>() => <A>(x: A) => A | B
const a = 123 //: number
const b = transform<string>()(a) //: string
为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)
答案 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);