2016-09-20 8 views
0

これはtypescriptですofficial documentからの例です:インデックスタイプが2回定義されているのはなぜですか?

class Animal { 
    name: string; 
} 
class Dog extends Animal { 
    breed: string; 
} 

// Error: indexing with a 'string' will sometimes get you a Dog! 
interface NotOkay { 
    [x: number]: Animal; 
    [x: string]: Dog; 
} 

何を私に混乱するインデックス型の定義である:私の印象で

interface NotOkay { 
    [x: number]: Animal; 
    [x: string]: Dog; 
} 

、インデックス型が配列(JavaScriptでのオブジェクト)のようなものです。 "[]"演算子(例:

a [10]または["Tom"])を使用すると、そのメンバーにのみアクセスできます。

上記の例がindexとreturnの2回定義されているのはなぜですか? 初めて:

[x: number]: Animal; 

二度目:

[x: string]: Dog; 

つのタイプであるべきである[]演算子を使用して?例えばa [10] ??

答えて

1

[]演算子を使用する場合は、どちらの型を指定する必要がありますか?例えばa [10] ??

{ 
    '1': 'Apples', 
    '2': 'Oranges' 
} 

の名と同じである

{ 
    1: 'Apples', 
    2: 'Oranges' 
} 

JavaScriptでは

(したがって、活字体で)オブジェクトは、例えば、自分の名前のような番号の特性を有することができますプロパティはキーとも呼ばれます。

私の印象では、インデックスタイプは配列(javascriptのオブジェクト)のようなものです。

オブジェクトは数字キーを持っているからといって、それがではありません自動的に配列:

var arr = ['Apples', 'Oranges']; 
console.log(arr.constructor); // logs 'function Array() { ... }' 
console.log(arr[1]); // logs 'Apples' 

var obj = { 1: 'Apples', 2: 'Oranges' }; 
console.log(obj.constructor); // logs 'function Object() { ... }' 
console.log(obj[1]); // logs 'Apples' 
console.log(obj['1']); // logs 'Apples' 

はインターフェースNotOkayが数値と非両方を持つことが許可されているオブジェクトについて説明し、と述べました - 数値キー。アクセス方法は、どのような方法でもインタフェースによって記述されたり制限されたりすることはありません。私を混乱させる何

うんインデックス型定義

です。これはまさにあなたが紹介したタイプスクリプトのハンドブックで、''文字列 'で索引付けするとDog'が得られることがあります。私が説明したアクセサーの構文がゆるやかであるため、数値キーでは1つのタイプにアクセスできるオブジェクトを持つことは非常に混乱し、非数値キーでは別のタイプにアクセスできます。明確にするために

:あなたは少しだけ例を変更した場合、もうインターフェースに誤りはないだろう:

class Animal { 
    name: string; 
} 
class Dog extends Animal { 
    //breed: string; <-- Dog and Animal now have the same interface 
} 

// No error because Dog and Animal have the same interface: 
interface Okay { 
    [a: number]: Animal; 
    [x: string]: Dog; 
} 

TypeScript playground

この例は結構です、活字体が構造型システムを使用するため:活字体で

タイプの互換性は、構造的なサブタイプに基づいています。 構造タイピングは、メンバー にのみ基づいてタイプを関連付ける方法です。これは公称タイピングとは対照的です。 more...

希望すると、これが役立ちます。

+0

構造型システムに基づいて、AnimalとDogは互いに割り当てることができます。したがって、あなたの遊び場の例にはエラーはありません。しかし、なぜ戻り値が同じ型であると考えることができるインデックスと戻り値の2つのセットを定義するのですか? –

+0

戻り値は関数から返された値です - あなたの質問に関数の返信文はありません: - /あなたが意味することを明確にできますか? –

+0

@ NicolasS.Xu私はあなたの質問に答えませんでしたか?そうでない場合は、私に知らせてください、私は喜んで助けてくれるでしょう。もしそうなら、それを受け入れることはいいだろう;-) –

関連する問題