Проблема в том, что конструктору 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 ?
);
Надеюсь, это поможет. Удачи!