2017-08-15 70 views
1

我認爲這是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

+0

由於信息:基於當前版本2.4的文檔Recrecive Types不允許用於類型別名https://www.typescriptlang.org/docs/handbook/advanced-types.html「但是,這是不可能的鍵入別名以顯示在聲明右側的任何其他位置......「 – Magu

+1

@Magu,我認爲這不是相關的;遞歸類型只在一個屬性中提到自己,這是允許的。 (類型編譯沒有錯誤的事實是一個很好的解決方案)。這裏的怪異與類型檢查有關。 – jcalz

+0

@ tugend,我在使用的打印機的2.5.0-dev.20170627版本上沒有看到這個錯誤。也許它是固定的?目前還不能跟蹤它 – jcalz

回答

1

它看起來像一個bug。解決方法:

正如我在the Github issue中注意到的,第一個也是最好的解決方法可能是打開strictNullCheckscompiler option。我真的建議打開它並保持一般,因爲它非常有用。


如果你不想這樣做,你總是可以只使用一個type assertion告訴你知道的比它的類型的編譯器。如果編譯器是關於做一個斷言確實性,你可以通過它通過any斷言,像這樣:

function create_2<T>(){ 
    let x: RecursivePartial<State<T>>; 
    let y: State<T>; 
    x = y as any as RecursivePartial<State<T>>; // I know it! 
} 

如果你不想這樣做,你可以改變的定義RecursivePartial<>以下幾點:

type RecursivePartial<T> = { 
    [P in keyof T]?: T[P] | RecursivePartial<T[P]>; 
}; 

這是,我認爲,實際上是相同的事情,但是編譯器有一個更輕鬆地看到你可以T類型的值總是分配給RecursivePartial<T>類型的變量。


希望有所幫助。祝你好運!

+0

由於我們必須改變多少代碼庫,我們要等設置strictNullChecks。三種解決方案都可以工謝謝! = d。我們現在很可能會用最後的解決方案。 – tugend