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试图找到错误消息中显示的最具描述性的类型,在您的情况下,它只是数字
谢谢,这很有帮助。我想我有点糊涂了。