これは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
情報として:現在のバージョン2.4のドキュメントに基づいてタイプ別名https://www.typescriptlang.org/docs/handbook/advanced-types.htmlではRecusive Typesは許可されていません "しかし、宣言の右側の他の場所に表示されるように型のエイリアスを入力してください... " – Magu
@マグ、私はここでは関係ないと思います。再帰型は、許可されているプロパティでのみ記述されます。 (タイプがエラーなしでコンパイルされているということは、それがうまくいくということです)。ここでの不思議さは型チェックと関係があります。 – jcalz
@tugend、私は使用しているtypescriptの2.5.0-dev.20170627バージョンでこのエラーが表示されません。多分それは修正されましたか? – jcalz