我認爲這是Typescript中的一個錯誤,我將其作爲問題here提交。我不希望它是固定的(至少不會很快,所以我要問你們,有沒有人碰巧有一個想法爲更好的解決方案/變通比create_1?遞歸類型定義似乎無法處理泛型?
代碼
type RecursivePartial<T> = {
[P in keyof T]?: RecursivePartial<T[P]>;
};
type State<T> = { value: T };
function create_1<T>(){
let _x: RecursivePartial<State<T>>;
let _y: State<RecursivePartial<T>>;
_x = _y;
}
function create_2<T>(){
/*
*/
let x: RecursivePartial<State<T>>;
let y: State<T>;
/*
Type 'State<T>' is not assignable to type RecursivePartial<State<T>>'.
Types of property 'value' are incompatible.
Type 'T' is not assignable to type RecursivePartial<T>[P]>'.
Type 'T[string]' is not assignable to type 'RecursivePartial<T[P]>'.
*/
x = y;
}
預期的行爲: 我所預料的第二個例子是有效的打字稿,即國家應該分配給RecursivePartial>這應該是情況下,任何國家將是一個局部的它自身給出T是相同類型
實際行爲: 我得到一個類型錯誤(見上文),似乎遞歸類型定義在遇到泛型時會中斷?
TS遊樂場鏈接 代碼和類型錯誤可以在這裏確認; ts-playground example
由於信息:基於當前版本2.4的文檔Recrecive Types不允許用於類型別名https://www.typescriptlang.org/docs/handbook/advanced-types.html「但是,這是不可能的鍵入別名以顯示在聲明右側的任何其他位置......「 – Magu
@Magu,我認爲這不是相關的;遞歸類型只在一個屬性中提到自己,這是允許的。 (類型編譯沒有錯誤的事實是一個很好的解決方案)。這裏的怪異與類型檢查有關。 – jcalz
@ tugend,我在使用的打印機的2.5.0-dev.20170627版本上沒有看到這個錯誤。也許它是固定的?目前還不能跟蹤它 – jcalz