2016-09-20 4 views
0

Это пример из машинописи official document:Почему тип индекса определяется два раза?

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

Почему приведенный выше пример определен дважды в индексе и возвращает? первый раз:

[x: number]: Animal; 

второй раз:

[x: string]: Dog; 

При использовании оператор [], какой из них должен быть типом? например а [10] ??

ответ

1

При использовании оператора [], который должен быть типом? например а [10] ??

В JavaScript (и, следовательно, в машинопись) объекты могут иметь свойства с номерами, как их названия, например:

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

Что такое же, как:

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

г. Название свойство также называется ключ.

В моем впечатлении тип индекса похож на массив (объект в 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 описывает объекты, которым разрешено иметь как числовой и не - цифровые клавиши. Доступ к ним не описывается или не ограничивается интерфейсами каким-либо образом.

Что меня смущает это определение типа индекса

Угу. Это именно то, что вы указали в справочнике TypeScript с индексом , «индексирование с помощью« строки »иногда дает вам собаку. Из-за слабого синтаксиса для аксессуаров, о котором я только что описал, было бы очень запутанно иметь объект, числовые ключи которого позволяют вам получить доступ к одному типу, в то время как нечисловые ключи позволяют вам получить доступ к другому.

Для наглядности: Если бы вы были модифицируем пример только немного, то не было бы никакой ошибки в интерфейсе больше:

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

На основе системы типа структуры животным и собаке разрешено назначать друг другу. Поэтому ваш пример игровой площадки не имеет ошибки. Но зачем определять два набора индекса и возвращаемого значения, в которых возвращаемое значение может считаться одним и тем же типом? –

+0

Возвращаемое значение - это значение, возвращаемое функцией - я не вижу никаких возвращаемых утверждений функций в вашем вопросе: -/Не могли бы вы пояснить, что вы имеете в виду? –

+0

@ NicolasS.Xu Разве я не ответил на ваш вопрос? Если нет, сообщите мне, и я буду рад помочь. Если это так, согласиться было бы приятно ;-) –

Смежные вопросы