实现泛型函数时将类型参数转发给泛型类型
Forward type parameters to generic type when implementing generic function
假设我得到了这样的函数类型。我已经可以实现那个类型的函数了,不需要再声明参数或者 return 类型:
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 和 return 类型,因为这违背了可共享 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 video如果你想深入挖掘。
假设我得到了这样的函数类型。我已经可以实现那个类型的函数了,不需要再声明参数或者 return 类型:
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 和 return 类型,因为这违背了可共享 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 video如果你想深入挖掘。