【问题标题】:How to create a generic function with type declared externally in Typescript?如何在 Typescript 中创建具有外部声明类型的泛型函数?
【发布时间】:2019-12-29 20:57:57
【问题描述】:

我有以下功能(它是一个 React 钩子):

type HandleEditFn = (name: string) => (data: any) => React.MouseEventHandler;

type useFormToggleHook = (params: {
    forms: {
        [propName: string]: React.ReactType;
    };
    formPropsFn?: (data: any) => object;
    refetch?: any;
}) => [...];

export const useFormToggle: useFormToggleHook = ({
    ...
}) {

    const handleEdit : HandleEditFn = name => data => e => {
        ...
    }

    return [handleEdit];

}

现在,我想让这个函数通用;因此,调用此钩子的组件可以执行以下操作:

const [handleEdit] = useFormToggle<UserData>(...);

所以,我在类型中添加了通用语法:

type HandleEditFn<T> = (name: string) => (data: T) => React.MouseEventHandler;

type useFormToggleHook<T> = (params: {
    forms: {
        [propName: string]: React.ReactType;
    };
    formPropsFn?: (data: T) => object;
    refetch?: any;
}) => [HandleEditFn<T>, ...];

// Type here doesn't work
export const useFormToggle: useFormToggleHook<T> = ({
    ...
}) {

    // Type is required here!
    const handleEdit : HandleEditFn<T> = name => data => e => {
        ...
    }

    return [handleEdit, ...];

}

当我为useFormToggle 函数添加useFormToggleHook&lt;T&gt; 时,我收到T 不是有效类型的错误。


我已阅读以下 Stackoverflow 帖子:TypeScript Type of generic function 但这并没有回答我的问题。我知道我可以做到以下几点:

export const useFormToggle : <T>(params: {
    forms: {
        [propName: string]: React.ReactType;
    },
    formPropsFn?: (data: any) => object;
    refetch?: any;
}) = ({ ... }) => ...

但是,我想单独声明函数的类型。打字稿可以做到这一点吗?

【问题讨论】:

    标签: reactjs typescript generics


    【解决方案1】:

    您必须在某处声明您的泛型类型才能使其工作。

    type HandleEditFn 使 HandleEditFn 成为泛型,传递给它的任何东西都是 T。

    您的问题是,您没有将实际类型传递给 HandleEditFn:

     const handleEdit : HandleEditFn<T> = name => data => e => {}
    

    因为 T 不是在某处声明的类型。

    要使其工作并在HandleEditFn 中声明 T,您必须这样称呼它:

    const handleEdit : HandleEditFn<string> = name => data => e => {}
    

    例如,这将创建数据字符串,但您可以传递任何类型或接口来定义 T 并将其用作数据。

    同样适用于 useFormToggleHook:

    export const useFormToggle: useFormToggleHook<string> = ()
    

    希望这会有所帮助。编码愉快。

    【讨论】:

    • 这是有道理的,但它对我的问题没有帮助。我想在函数调用期间声明我的类型,而不是在函数声明期间。所以,从某种意义上说,我不会重用类型,而是要重用函数本身。
    • 你能举个例子说明你会如何使用它吗?
    • 以上链接是我想要实现的。不知何故,像 React 这样的库具有接受泛型并按预期工作的函数,但我无法让它们工作。我是否不应该将内部函数声明为泛型而只对它们进行类型转换?
    猜你喜欢
    • 1970-01-01
    • 2023-01-09
    • 2017-06-12
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多