Что означает это объявление типа в Typescript?

Я новичок в Typescript и читаю чужой код, и у меня проблемы с этим объявлением:

    private somevar: { [s: string]: string };

Что это за тип? Квадратные скобки обозначают массив, но я не совсем понимаю, в какой форме это будет.

Ответы на вопрос(2)

Для дальнейшего объяснения ответаДэвид Шеррет

ОтTypscript документы

Индексируемые типы Аналогично тому, как мы можем использовать интерфейсы для описания типов функций, мы также можем описывать типы, в которые мы можем «индексировать», например, [10] или ageMap ["daniel"]. Индексируемые типы имеют сигнатуру индекса, которая описывает типы, которые мы можем использовать для индексации объекта, вместе с соответствующими типами возврата при индексации. Давайте возьмем пример:

interface StringArray {
    [index: number]: string;
}

let myArray: StringArray;
myArray = ["Bob", "Fred"];

let myStr: string = myArray[0];

Выше у нас есть интерфейс StringArray, который имеет подпись индекса. Эта индексная сигнатура гласит, что когда StringArray проиндексирован числом, он вернет строку.

Существует два типа поддерживаемых подписей индекса: строка и число. Можно поддерживать оба типа индексаторов, но тип, возвращаемый из числового индексатора, должен быть подтипом типа, возвращаемого из строкового индексатора. Это связано с тем, что при индексировании по числу JavaScript фактически преобразует его в строку перед индексацией в объект. Это означает, что индексирование с помощью 100 (число) - это то же самое, что индексирование с помощью «100» (строка), поэтому эти два параметра должны быть согласованными.

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;
}

Хотя подписи строкового индекса являются мощным способом описания шаблона «словарь», они также обеспечивают соответствие всех свойств своему типу возвращаемого значения. Это потому, что строковый индекс объявляет, что obj.property также доступен как obj ["property"]. В следующем примере тип name не совпадает с типом строкового индекса, и средство проверки типов выдает ошибку:

interface NumberDictionary {
    [index: string]: number;
    length: number;    // ok, length is a number
    name: string;      // error, the type of 'name' is not a subtype of the indexer
}
Решение Вопроса

Это индексируемый тип. Глядя на выражение типа определения этой переменной:

let myIndexVar: { [key: string]: number; };
: { ... } означает, что это объект.[key: string]: number; является индексом подписи объекта.

Внутри подписи индекса:

[key: string] определяет название ключаkeyИ тип ключаstring.: number; это тип значенияnumber.

Эти типы используются так:

let myIndexVar: { [key: string]: number; } = {};

myIndexVar["key"] = 4; // key is string, value is number

Обратите внимание, что вы можете дать ключу любое имя, которое вам нравится. Задание описательного имени полезно для определения ключа, хотя имя переменной также должно делать это:

 Cedric Reichenbach06 сент. 2017 г., 15:31
Стоит отметить, чтоkey может быть любой строкой, т.е.myIndexVar["foobar"] = 37 было бы действительным назначением тоже в этом случае.

Ваш ответ на вопрос