Typescript 具有特定叶类型的嵌套对象的类型

Typescript 具有特定叶类型的嵌套对象的类型,typescript,recursive-datastructures,Typescript,Recursive Datastructures,我想要嵌套对象的类型,它们的叶子上有一个特定的类型 我希望这是正确的: let a: Leaves<number> = { "foo": 1, "bar": { "baz": 2 } }; 让a:Leaves={ “福”:1, “酒吧”:{ “baz”:2 } }; 这是一个失败的例子: let a: Leaves<number> = { "foo": 1, "bar": { "baz": 'so

我想要嵌套对象的类型,它们的叶子上有一个特定的类型

我希望这是正确的:

let a: Leaves<number> = {
    "foo": 1,
    "bar": {
        "baz": 2
    }
};
让a:Leaves={
“福”:1,
“酒吧”:{
“baz”:2
}
};
这是一个失败的例子:

let a: Leaves<number> = {
    "foo": 1,
    "bar": {
        "baz": 'something else' // Leaf of type string
    } 
};
让a:Leaves={
“福”:1,
“酒吧”:{
“baz”:“something other”//string类型的叶子
} 
};
我试过了

export type Leaves<T> = {
    [P in keyof T]: T | Leaves<T>;
}
导出类型叶子={
[P in keyof T]:T |叶;
}
然而,根据该定义,两个示例都给出了编译错误。第一个表示,
Type'{“foo”:number;“bar”:number;}'不能分配给Type'number.


是否有办法解决此问题?

如果您需要具有任意键的节点的类型,以及作为叶子或其他节点的值,那么可以这样做:

export type Leaves<T> = {
    [n: string]: T | Leaves<T>
}
导出类型叶子={
[n:string]:T |叶
}
(顺便说一句,我宁愿叫它
节点
,而不是
叶子

映射类型在此不适用,因为像这样的映射类型

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

只能具有
T
所具有的属性-这就是
[p in keyof T]:
所说的。当
T
number
时,这意味着映射类型只能具有
number
类型中的属性,并且由于
number
是基本类型,因此本质上意味着它与
number
相同。这就是
无法分配给数字的原因
错误消息-typescript试图找到错误消息中显示的最具描述性的类型,在您的情况下,它只是
数字

谢谢,这很有帮助。我想我有点糊涂了。