我是 TypeScript 的新手,并且在某些事情上遇到了困難。我已經全面搜索了 Google & SO。以下代碼沒有錯誤,問題是 TS 和 IDE 不知道正確的回傳型別,這違背了體系結構的目的。
class Data {
schema: z.Schema<any>
parse(): this["parse"] {
return this.schema.parse({});
}
}
class LoginData extends Data {
schema = z.object({
email: z.string(),
password: z.string()
})
}
const data = new LoginData().parse();
將parse方法直接添加到LoginData類時,TS 能夠正確推斷回傳型別:

但是直接使用父方法的時候,TS就搞糊涂了:

uj5u.com熱心網友回復:
如果我們做一些詭計,我們可以像這樣將子類傳遞給父類:
import z from "zod";
abstract class Data<T extends { schema: z.Schema<any> }> {
abstract schema: T["schema"];
parse(): z.infer<T["schema"]> {
return this.schema.parse({});
}
}
class LoginData extends Data<LoginData> {
schema = z.object({
email: z.string(),
password: z.string(),
});
}
然后在父類中,我們可以獲取模式T["schema"]并根據需要使用它。在這里,我們將其用作 的型別schema和 的回傳型別parse。這是有效的,因為schema父類中的型別現在與schema子類中的型別相同。
z.infer是來自 Zod 的內置型別,它為我們提供了模式中的決議型別。
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/520799.html
標籤:打字稿遗产多态性
上一篇:如何將django'models.py'、'views.py'、'serializers.py'檔案拆分為多個檔案
