打字稿错误:对象可能"未定义"。根据对象映射的内容对数组进行排序时



错误是currEmot可能未定义。我很困惑为什么会发生这种情况,因为for循环保证循环通过表情对象并将对象添加到地图中。

let emotionsObject = [
{
size: 80,
background: 'rgb(67, 0, 128)',
width: .5,
emoji: "😄",
name: 'joy'
},
{
size: 34,
background: 'rgb(0, 45, 172)',
width: .35,
emoji: "😭",
name: 'sadness',
},
{
size: 50,
background: 'rgb(172, 6, 0)',
width: .15,
emoji: "😡",
name: 'anger',
},
];
type T_Emotion = typeof emotionsObject[0] 
let currEmot = new Map<string, T_Emotion>(null!);
let emotOrder: string[] = [];
for (let i = 0; i < emotionsObject.length; i++) {
let id = uuid_v4();
emotOrder.push(id)
currEmot.set(id, emotionsObject[I]);
}
emotOrder.sort((a: string, b: string):number => currEmot.get(b).width - currEmot.get(a).width);

我已经尝试过这些其他版本来防止这个错误。

emotOrder.sort((a: string, b: string):number => currEmot?.get(b)?.width - currEmot?.get(a)?.width);
emotOrder.sort((a: string, b: string):number => currEmot.get(b).width as number - currEmot.get(a).width as number);

使用bang运算符!告诉typescript不会出现找不到对象的情况

currEmot.get(b)!.width - currEmot.get(a)!.width

您需要创建Interface并将其设置为您的对象

interface IEmotions {
size: number
background: string
width: number
emoji: string
name: string
}

请记住,如果任何key可能未定义,则需要将?添加到key中,例如:size?: number

let emotionsObject: (IEmotions | undefined)[] = [
{
size: 80,
background: 'rgb(67, 0, 128)',
width: .5,
emoji: "😄",
name: 'joy'
}, 
{
size: 34,
background: 'rgb(0, 45, 172)',
width: .35,
emoji: "😭",
name: 'sadness',
}
];

最新更新