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" }
    ]}
]

しかし、コンパイルするとエラーが発生します:

「配列リテラル式の型に互換性がありません: タイプ '{ コンテンツ: 文字列; 開かれた: bool; 子: { コンテンツ: 文字列; 値: 文字列; }[]; }' には、型 '{ コンテンツ: 文字列; からのプロパティ '値' がありません。値: 文字列; }'"

私が変われば

{ 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した場合、この種の支援は得られません。

xTypeScriptが型であると伝えることで、混合配列を使用することを決定できますany[]。その場合、エラーはなくなります。

間違いを犯した場合に備えて、TypeScript は互換性のない型について警告することから始めた方がよいでしょopenedvalue

于 2012-11-12T20:03:34.230 に答える