我的代碼是這樣的:
export interface TreeItem {
id: string;
children: this[];
collapsed?: boolean;
}
const createTreeItem = <T extends TreeItem>(): T => {
return {
id: 'root',
children: []
}
}
但是我收到一個關于回傳型別的錯誤,createTreeItem如下所示:
TS2322: 型別 '{ id: string; 孩子們:從不[]; }' 不可分配給型別 'T'。'{ id: 字串; 孩子們:從不[]; }' 可分配給'T' 型別的約束,但'T' 可以用約束'TreeItem' 的不同子型別實體化。
我完全不知道這是什么意思。
有什么幫助嗎?
uj5u.com熱心網友回復:
因此,假設您按如下方式呼叫您的函式:
let node = createTreeItem<TreeItem>()
一切都很好,對吧?回傳型別T是TreeItem,并且您的泛型函式被硬編碼以回傳的物件實際上具有將其限定為 的型別TreeItem:
{ id: string; children: never[]; }
但是給你的函式一個型別引數的重點是允許它被其他型別的 呼叫T,只要它們擴展TreeItem。所以以下應該是合法的電話:
export interface BidiTreeItem {
id: string;
children: this[];
parent: this;
collapsed?: boolean;
}
let node = createTreeItem<BidiTreeItem>()
呼叫是合法的,因為BidiTreeItem滿足約束T extends TreeItem。此呼叫的回傳型別,如您的函式定義中所宣告的,是BidiTreeItem,但您的函式回傳的不是BidiTreeItem。
如果您再次閱讀錯誤訊息,但記住上面的示例,現在對您來說就有意義了。但為了以防萬一,下面我將翻譯每一條錯誤訊息。請注意,第一句話是結論,因此將放在此表的最后:
| 這部分錯誤資訊... | 這意味著(使用上面的例子)... |
|---|---|
'{ id: string; children: never[]; }' is assignable to the constraint of type 'T' |
'{ id: string; children: never[]; }' 與約束一致 T extends TreeItem |
but 'T' could be instantiated with a different subtype of constraint 'TreeItem'. |
但T可以使用不同的子型別實體化TreeItem,例如BidiTreeItem。 |
TS2322: Type '{ id: string; children: never[]; }' is not assignable to type 'T'. |
您的函式回傳的物件不能保證可以分配給 type T,因為T可能是其他一些子型別,例如 BidiTreeItem. |
uj5u.com熱心網友回復:
您可以在回傳后添加“作為 T”:
const createTreeItem = (): T => ({ id: 'root', children: [] } as T);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/383501.html
標籤:javascript 打字稿 界面 打字稿泛型
上一篇:在tkinter中的window.destroy()之前執行命令
下一篇:優化打字稿中的條件檢查
