2017-05-05 10 views
0

ネストされたオブジェクトのタイプ、葉に特定のタイプを持つタイプが必要です。特定のリーフタイプを持つネストされたオブジェクトのタイプ

let a: Leaves<number> = { 
    "foo": 1, 
    "bar": { 
     "baz": 2 
    } 
}; 

をし、これが失敗する:

私はこれが正しいと期待

let a: Leaves<number> = { 
    "foo": 1, 
    "bar": { 
     "baz": 'something else' // Leaf of type string 
    } 
}; 

私は

export type Leaves<T> = { 
    [P in keyof T]: T | Leaves<T>; 
} 

を試してみましたが、その定義との両方の例は、コンパイルエラーを与えます。最初のものは Type '{ "foo": number; "bar": number; }' is not assignable to type 'number'.

これを修正する方法はありますか?

答えて

1

あなたは、任意のキーを持つノードの型が必要な場合は、葉または他のノードなどの値、indexable typeが移動するための方法である:

export type Leaves<T> = { 
    [n: string]: T | Leaves<T> 
} 

(ところで、私はむしろLeaves<T>Node<T>それをしませ呼びたいです)

この

{ 
    [P in keyof T]: T | Leaves<T>; 
} 

のようなマッピングされたタイプがプロパティのみを持つことができるので、マッピングされたタイプは、ここで適切ではありませんは - それは[P in keyof T]:のことです。 Tnumberの場合、マップされたタイプはnumberタイプのプロパティのみを持つことができ、numberは基本的にnumberと同じであることを意味します。それはnot assignable to numberエラーメッセージの理由です - typescriptはエラーメッセージで表示する最も記述的なタイプを見つけようとし、あなたのケースではそれはちょうどnumberです。

+0

ありがとうございました。私は少し混乱していたと思います。 – MaximeW

関連する問題