如何在TypeScript类型提示泛型作为参数?



我在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方法。当显式类型参数不能被推断时,需要显式类型参数,例如,如果它们驱动一个方法的返回类型,否则该方法无法完全指定它返回的是什么,因为它太动态了。

手册的泛型部分有更多的例子。

最新更新