2017-05-05 71 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