有没有一种好方法可以告诉打字稿地图中存在所有数组元素?
Is there a good way of telling typescript all array elements exist in a Map?
假设我正在从一个对象数组中创建一个映射,并将 id 作为键,然后从具有相同 id 的不同数组访问该映射:
const arr1 = [
{id: 'a', firstName: 'Jeff'},
{id: 'b', firstName: 'John'},
{id: 'c', firstName: 'Jeremy'}
];
const map1 = new Map(arr1.map(element => [element.id, element]));
const arr2 = [
{id: 'b', lastName: 'Johnson'},
{id: 'c', lastName: 'Jackson'},
{id: 'd', lastName: 'Jenkins'}
];
const arr2InMap1 = arr2.filter(element => map1.has(element.id));
arr2InMap1.forEach(element => console.log(`${map1.get(element.id).firstName} ${element.lastName}`));
如果我有“strictNullChecks”:true,那么最后一行会抛出“对象可能是'undefined'”错误,即使它永远不会是未定义的。
有没有办法告诉打字稿数组中的元素存在于地图中?
我知道我可以使用 '!'运算符,或创建一个仅 returns T 而不是 T | 的函数undefined 来替换 Map.get,但是有没有更好的方法来实现这个?
不,那是 Map.get
的签名。如果这很麻烦,普通对象可能更适合您的情况:
const obj1 = arr1.reduce(
(obj, value) => (obj[value.id] = value) && obj,
{} as Record<string, typeof arr1[number]>,
);
const arr2InMap1 = arr2.filter(element => element.id in obj1);
arr2InMap1.forEach(element => console.log(`${obj1[element.id].firstName} ${element.lastName}`));
假设我正在从一个对象数组中创建一个映射,并将 id 作为键,然后从具有相同 id 的不同数组访问该映射:
const arr1 = [
{id: 'a', firstName: 'Jeff'},
{id: 'b', firstName: 'John'},
{id: 'c', firstName: 'Jeremy'}
];
const map1 = new Map(arr1.map(element => [element.id, element]));
const arr2 = [
{id: 'b', lastName: 'Johnson'},
{id: 'c', lastName: 'Jackson'},
{id: 'd', lastName: 'Jenkins'}
];
const arr2InMap1 = arr2.filter(element => map1.has(element.id));
arr2InMap1.forEach(element => console.log(`${map1.get(element.id).firstName} ${element.lastName}`));
如果我有“strictNullChecks”:true,那么最后一行会抛出“对象可能是'undefined'”错误,即使它永远不会是未定义的。 有没有办法告诉打字稿数组中的元素存在于地图中?
我知道我可以使用 '!'运算符,或创建一个仅 returns T 而不是 T | 的函数undefined 来替换 Map.get,但是有没有更好的方法来实现这个?
不,那是 Map.get
的签名。如果这很麻烦,普通对象可能更适合您的情况:
const obj1 = arr1.reduce(
(obj, value) => (obj[value.id] = value) && obj,
{} as Record<string, typeof arr1[number]>,
);
const arr2InMap1 = arr2.filter(element => element.id in obj1);
arr2InMap1.forEach(element => console.log(`${obj1[element.id].firstName} ${element.lastName}`));