В Typescript ошибка построения Map <string, T> из массива <T>с использованием общего строкового поля для ключа - PullRequest
0 голосов
/ 04 ноября 2018

Следующий код в Typescript выдает ошибку присваивания в последней строке

interface T {id: string}
let ts: Array<T> = []
let tMap: Map<string, T> =
    new Map (
        ts.map(t => [t.id, t])
    )

Подобный код в среде javascript работает. Не могу понять, что я делаю не так

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

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

let tMap: Map<string, T> =
  new Map(ts.map<[string, T]>(t => [t.id, t]))
0 голосов
/ 04 ноября 2018

Проблема в том, что конструктору Map требуется массив из двух элементов кортежей , но TypeScript не выводит типы кортежей из строковых литералов . Это означает следующее:

const foo = [1, "two"]; 

выводится как тип массива Array<string | number>, а не тип кортежа [number, string]. Если вы хотите, чтобы это было [number, string], вы можете использовать явную аннотацию типа, такую ​​как

const foo: [number, string] = [1, "two"];

или утверждение типа как

const foo = [1, "two"] as [number, string];

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

const tuple = <T extends any[]>(...t: T) => t;

и затем используйте его:

const foo = tuple(1, "two"); // inferred as type [number, string]

Любой из них поможет вам [t.id, t] вести себя правильно. Давайте попробуем последний:

interface T { id: string }
let ts: Array<T> = []
let tMap: Map<string, T> =
  new Map(
    ts.map(t => tuple(t.id, t))  // okay ?
  );

Надеюсь, это поможет. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...