2017-08-15 14 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; 
} 

期待される動作: 私は、有効なtypescriptですように第二の例を期待していた、すなわち国家は> RecursivePartialに割り当て可能でなければならないすべての国がTである与えられた自己それの一部になり、これはケースでなければなりません。同タイプ。

実際の動作: タイプエラーが発生しました(上記参照)、再帰型定義はジェネリックに遭遇したときに壊れているようです。

TSプレイグラウンドリンク コードとタイプのエラーはここで確認できます。 ts-playground example

+0

情報として:現在のバージョン2.4のドキュメントに基づいてタイプ別名https://www.typescriptlang.org/docs/handbook/advanced-types.htmlではRecusive Typesは許可されていません "しかし、宣言の右側の他の場所に表示されるように型のエイリアスを入力してください... " – Magu

+1

@マグ、私はここでは関係ないと思います。再帰型は、許可されているプロパティでのみ記述されます。 (タイプがエラーなしでコンパイルされているということは、それがうまくいくということです)。ここでの不思議さは型チェックと関係があります。 – jcalz

+0

@tugend、私は使用しているtypescriptの2.5.0-dev.20170627バージョンでこのエラーが表示されません。多分それは修正されましたか? – jcalz

答えて

1

私はバグのようです。回避策:

私はthe Github issueに気づいたように、第1及び最適な回避策が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]>; 
}; 

これは、私は信じて、効果的に同じものであるが、コンパイラは簡単に時間いつでもタイプRecursivePartial<T>の変数にタイプTの値を割り当てることができることを見ています。


希望します。がんばろう!

+0

strictNullChecksの設定を変更する必要があるコードベースの量によって、待ちます。 3つのソリューションはすべて機能します。ありがとうございました! = D。私たちは今のところ最後の解決策をもっている可能性が最も高いです。 – tugend

関連する問題