Typescript - 为非常通用的功能定义接口[重复]

Posted

技术标签:

【中文标题】Typescript - 为非常通用的功能定义接口[重复]【英文标题】:Typescript - Define interface for a very general function [duplicate] 【发布时间】:2020-09-24 17:29:03 【问题描述】:

我提供了函数functionCaller 的示例。它需要一个函数,任何类型的函数。

const functionCaller = (func: any /* how to define this general func? */) => 
  func();
;

functionCaller((hello: string) => );
functionCaller(() => );
functionCaller(() => new Promise((resolve) => ));

如何在不使用any 的情况下定义这样的函数参数?

【问题讨论】:

【参考方案1】:

我向您推荐以下内容,这将允许您拥有返回数据的类型:

function functionCaller<T extends (...args: any[]) => any>(func: T): ReturnType<T> 
    return func();


const funcA = (hello: string) =>  ;
const funcB = () =>  ;
const funcC = () => new Promise((resolve) =>  )

const typeA = functionCaller<typeof funcA>(funcA);

const typeB = functionCaller<typeof funcB>(funcB);

const typeC = functionCaller<typeof funcC>(funcC);

playground

【讨论】:

【参考方案2】:

如果这种类型非常灵活,您将始终以any 结尾。

但是,函数类型会是这样的

type AnyFunction = (...args: any[]) => any;

const functionCaller = (func: AnyFunction) => 
    func();

或者,您可以通过使用泛型类型来更精确。

type Args = any[] | never;
type AnyFunction<TArgs extends Args, TResult> = (...args: TArgs) => TResult;

const functionCaller = <TResult>(func: AnyFunction<any[], TResult>) => 
    func();

希望对你有帮助。

【讨论】:

【参考方案3】:

使用这个:

const functionCaller = (func: Function) => 
  func();
;

【讨论】:

【参考方案4】:

你可以这样定义:

const functionCaller = (func: () => any) => 
  func();
;

希望这会有所帮助。

【讨论】:

以上是关于Typescript - 为非常通用的功能定义接口[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据组表示为通用 Typescript 接口

在 typescript 中定义功能组件的状态接口

sequelize-typescript:模型中get()的通用方法

映射具有未知深度的通用 TypeScript 接口

TypeScript 入门14.泛型

使用类型别名与接口在 Typescript 中注释 React 功能组件