如何使Typescript识别递归类型而不落在字符串上

How to make Typescript recognize recursive type without falling on string

我需要编写一个将数字树建模为嵌套数组的 Typescript 程序。意思是,当某些叶子不是数字,而是例如布尔值或字符串时,它应该给出错误。我写的代码:

interface Tree {
    [index: number]: number | Tree;
}
let a:Tree = [1, 3, [4, 8, [], 5, 9, true, [[[0]]]]];
let b:Tree = [true];
let c:Tree = true;
let d:Tree = 3;

它按预期工作,有四个编译错误。前两个因为 true 不是数字,后两个因为值不是数组。不幸的是,代码

interface Tree {
    [index: number]: number | Tree;
}
let e:Tree = [1, 3, [4, 8, [], 5, 9, "abc", [[[0]]]]];
let f:Tree = ["abc"];
let g:Tree = "abc";

编译,尽管 "abc" leaf 既不是数字也不是树数组。不知何故,字符串被识别为递归类型。 有没有办法让打字稿看到问题?也许不同的树定义,或者别的什么?我知道我可以使用 typeof 在 JS 中轻松解决它,但我需要 Typescript(意思是静态)解决方案。谢谢。

这是因为在访问对象时,数字键被视为字符串。不过,您可以执行以下操作来限制属性的值:

interface Tree {
    [key: number]: Array<Tree | number> | number;
}