【问题标题】:How to type-hint generic as a parameter in TypeScript?如何在 TypeScript 中将泛型类型提示为参数?
【发布时间】:2021-08-05 20:44:45
【问题描述】:

我在 TypeScript 中创建了一个简单的 Form 类:

class Form<FormData> {
    protected data: FormData;

    constructor(data: FormData) {
        this.data = data;
    }
}

我添加了类型参数,以便我可以在实例化此类时键入表单应接收的数据。例如:

interface UpdateUserForm {
    name: string;
    email: string;
}

const updateUserForm = new Form<UpdateUserForm>;

但是,当我尝试使用我的 Form 类作为其他类的参数时遇到问题,因为它需要类型。所以,给定一个这样的方法:

class Http {
    post(url: string, form: Form) {
        return axios(url, form.data);
    }
}

我收到以下错误:

通用类型“表单”需要 1 个类型参数。

但是,我不知道这个方法中的 FormData 类型是通用的。

我将如何正确地对这个 form 参数进行类型提示?

【问题讨论】:

  • 使 method 通用,所以它可以是例如Form&lt;T&gt;?请参阅typescriptlang.org/docs/handbook/2/generics.html 中的示例。
  • 谢谢。这是否意味着我需要在调用post 方法时不断指定类型,即post&lt;UpdateUserForm&gt;(url, form)?我只是想传递一个Form 实例,而不用担心它的类型。
  • @MartinBean - 不,TypeScript 可以从您在调用站点提供给函数的实际表单参数推断它。例如,如果您调用post 的表单的类型为Form&lt;NiftyData&gt;,则调用只是post("/path/to/whatever", theForm),调用时不需要类型参数。
  • 谢谢@jonrsharpe,有点误读。马丁,我的意思是post&lt;FormDataType&gt;(url: string, Form&lt;FormDataType&gt;)
  • @T.J.Crowder 谢谢,这似乎有效。您可以添加您的评论作为答案吗?然后我可以将此问题标记为已回答。

标签: typescript typescript-generics


【解决方案1】:

正如@jonrsharpe 在 cmets 中所说,您可以使 方法 通用,如下所示:

post<FormDataType>(url: string, form: Form<FormDataType>) {
    // ...
}

当您调用它时,TypeScript 将根据您传递给它的 Form 的类型推断类型参数。例如,如果您有:

const niftyForm = new Form<NiftyData>(/*...*/);
// ...
http.post("/some/url", niftyForm);

...TypeScript 将从 niftyForm(即 Form&lt;NiftyData&gt;)的类型推断 NiftyData 的类型参数为 post。 (您也可以显式地提供它,但是这个 post 方法不需要。当它们无法推断时,需要显式类型参数,例如,如果它们驱动 a 的返回类型方法,否则无法完全指定它返回的内容,因为它太动态了。)

the handbook's section on generics中有更多例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2021-12-08
    • 2020-11-11
    • 2021-06-24
    • 2021-11-01
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多