假设我得到了这样的函数类型。我已经可以实现该类型的函数,而不需要再次声明参数或返回类型:
type MyFunc = (args: string) => boolean;
// TS knows args is a string and return is boolean 👍
const myFunc: MyFunc = (args) => true;
然而,假设我得到了一个泛型函数类型。我想实现一个遵循这种类型的函数,但将泛型类型参数转发给调用者。这可能吗?我的尝试出现错误:
type ReturnsSomething<A> = (args: A) => A;
// Generic type 'ReturnsSomething' requires 1 type argument(s).ts(2314)
const logAndReturnSomething: ReturnsSomething = (args) => {
console.log(args);
return args;
};
logAndReturnSomething<string>('asdf');
这也不起作用:
type ReturnsSomething<A> = (args: A) => A;
// Cannot find name 'A'.ts(2304)
const logAndReturnSomething: ReturnsSomething<A> = (args) => {
console.log(args);
return args;
};
logAndReturnSomething<string>('asdf');
在更复杂的情况下,我不想在我的所有实现中重新定义args和返回类型,因为这违背了可共享ReturnsSomething
泛型的目的。有没有任何方法可以实现一个泛型函数,将其类型参数转发到泛型类型?
我可以创建一个包装器函数来强制执行这种类型,但这意味着我每次使用都需要一个双函数调用,我希望有一种更干净的方法:
type ReturnsSomething<A> = (args: A) => A;
function makeLogAndReturnSomething<A>(): ReturnsSomething<A> {
return (args) => {
console.log(args);
return args;
};
}
makeLogAndReturnSomething<string>()('asdf');
我使用typescript 4.6是为了它的价值,不确定4.7是否会解决这个问题,或者我是否缺少一些TS语法。
试试这个:
type GenericFn = <A>(args: A) => A;
const logAndReturnSomething: GenericFn = (args) => {
console.log(args);
return args;
};
const result = logAndReturnSomething('asdf'); //infers return type as string
本质上,我们不是在创建泛型类型,而是在创建泛型函数。我知道这很令人困惑:(
如果你想更深入地挖掘,youtube上有一个很棒的短视频。
TS游乐场