我在TypeScript中创建了一个简单的Form
类:
class Form<FormData> {
protected data: FormData;
constructor(data: FormData) {
this.data = data;
}
}
我已经添加了type参数,这样我就可以键入表单在实例化该类时应该接收的数据。例如:interface UpdateUserForm {
name: string;
email: string;
}
const updateUserForm = new Form<UpdateUserForm>;
然而,当我试图使用我的Form
类作为其他类的参数时,我遇到了一个问题,因为它期望类型。那么,给定这样一个方法:
class Http {
post(url: string, form: Form) {
return axios(url, form.data);
}
}
我得到以下错误:
泛型'Form'需要1个类型参数。
然而,我不知道这个方法中的FormData
类型,因为它是通用的。
我该如何正确地对这个form
参数进行类型提示?
正如@jonrsharpe在评论中所说,您可以使方法泛型,如下所示:
post<FormDataType>(url: string, form: Form<FormDataType>) {
// ...
}
当你调用它时,TypeScript会根据你传递给它的Form
的类型来推断类型参数。例如,如果您有:
const niftyForm = new Form<NiftyData>(/*...*/);
// ...
http.post("/some/url", niftyForm);
…TypeScript会从niftyForm
(即Form<NiftyData>
)的类型中推断出post
的类型参数为NiftyData
。(您也可以显式地提供它,但是不需要使用这个post
方法。当显式类型参数不能被推断时,需要显式类型参数,例如,如果它们驱动一个方法的返回类型,否则该方法无法完全指定它返回的是什么,因为它太动态了。
手册的泛型部分有更多的例子。