2

我正在尝试在打字稿中执行以下操作:

var testHier = [
    { content:"1", opened:true, children: [
        { content:"1.1" }
    ]},
    { content: "2", opened:true, children: [
        { content:"2.1", opened:false, children: [
            { content:"2.1.1", value:"2.1.1" }
        ]},
        { content: "2.2", value: "2.2" }
    ]}
]

但是当我编译时出现错误:

“数组文字表达式中的不兼容类型:类型'{内容:字符串;打开:布尔;子项:{内容:字符串;值:字符串;}[];}'缺少来自类型'{内容:字符串的属性'值';值:字符串;}'"

如果我改变

{ content:"2.1", opened:false, children: [

{ content:"2.1", opened:false, value:"foo", children: [

错误消失了。

我在 chrome 控制台中测试了声明,它似乎工作得很好。由于这只是 javascript,我希望它可以直接通过,但似乎并非如此。有人知道这里发生了什么吗?

4

1 回答 1

5

您只需要使用一些类型信息来帮助它:

interface IExample {
    content: string;
    opened?: bool;
    value?: string;
    children?: IExample[];
}

var testHier: IExample[] = [
{ 
    content:"1", 
    opened:true, 
    children: [
        { 
            content:"1.1" 
        }
    ]
},
{
    content: "2", 
    opened:true, 
    children: [
        { 
            content:"2.1", 
            opened:false, 
            children: [
                { 
                    content:"2.1.1", 
                    value:"2.1.1"
                }
            ]
        },
        { 
            content: "2.2", 
            value: "2.2" 
        }
    ]
}];

它试图弄清楚数组的每个部分中的类型是什么,并且无法提出猜测所需的共性 - 在数组中它需要所有内容都是相同的类型(即所有字符串或所有数字,但是不是混合物!)。IExample 接口通过指定any类型来提供帮助。

为什么 TypeScript 会这样做?

TypeScript 想帮助你。如果它可以为您推断出一个类型,那么您就不必显式声明它,它会的。总的来说,这是有益的 - 它会检测以下脚本中的错误:

var x = [
    10,
    20,
    "30",
    50
];

在这种情况下,它推断您有一个数字数组,因为警告您那里有一个字符串。如果它使用any而不是巧妙地计算类型,您将不会获得这种帮助。

x你仍然可以通过告诉 TypeScript是类型来决定你想要一个混合数组,any[]在这种情况下错误就会消失。

TypeScript 最好首先警告您有关不兼容的类型,以防您犯了错误 - 例如,在您的情况下,您可能忘记向每个对象添加openedvalue- 这样 TypeScript 可以使您免于错误。

于 2012-11-12T20:03:34.230 回答