2017-05-05 72 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> 
} 

(順便說一句,我寧願把它Node<T>,不Leaves<T>因爲映射類型這樣

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

只能有屬性)

映射類型不適合這裏T有 - 這就是[P in keyof T]:說。當Tnumber時,這意味着映射類型只能具有number類型的屬性,並且因爲number是原始類型,所以它本質上意味着它與number相同。這就是not assignable to number錯誤信息的原因 - typescript試圖找到最錯誤消息中顯示的描述性類型,在你的情況下,它只是number

+0

謝謝,這很有幫助。猜猜我有點困惑。 – MaximeW