typescript 无法调用map的值,因为可能未定义

6yoyoihd  于 2023-08-08  发布在  TypeScript
关注(0)|答案(2)|浏览(188)

在我的应用程序中,我有一个Map,它返回一组设置,将用户的角色作为一个键。

enum Role {
    ROLE_1 = "role"
}
const settingsRole1 = {}
const defaultSettings = {}
const secondParameter = ""

const map = new Map<Role, any>([
    [Role.ROLE_1, settingsRole1]
]);
const settings = map.get(Role.ROLE_1) ?? defaultSettings;

字符串
现在我想引入第二个参数。因为我想尽可能少地修改代码,所以我想将Map<Role, Settings>转换为Map<Role, (secondParameter: string) => Settings>,从Map中返回一个函数,稍后将调用该函数。

enum Role {
    ROLE_1 = "role"
}
const settingsRole1 = {}
const defaultSettings = {}
const secondParameter = ""

const map = new Map<Role, (secondParameter: string) => any>([
    [Role.ROLE_1, (secondParameter: string) => settingsRole1]
]);
const settings = map.get(Role.ROLE_1)(secondParameter) ?? defaultSettings;


我在尝试调用从map返回的函数时收到此错误:TS2722: Cannot invoke an object which is possibly 'undefined'的值。
我试着保护它,但似乎不起作用...

enum Role {
    ROLE_1 = "role"
}
const settings = {}
const defaultSettings = {}

const map = new Map<Role, (secondParameter: string) => any>([
    [Role.ROLE_1, (secondParameter: string) => settings]
]);
const settings = map.has(Role.ROLE_1) ? map.get(Role.ROLE_1)(secondParameter) : defaultSettings;


我不知道如何使警卫工作,无论如何,我会考虑尝试其他方法,如果你想建议一个

vmdwslir

vmdwslir1#

可以对第一个参数使用可选的链接?.

const settings = map.get(Role.ROLE_1)?.(secondParameter) ?? defaultSettings;

字符串

tgabmvqs

tgabmvqs2#

在表达式后使用!来告诉编译器忽略它的可空性。在您的情况下,它应该是(与显式密钥检查)

const settings = map.has(Role.ROLE_1) ? map.get(Role.ROLE_1)!(secondParameter) : defaultSettings;

字符串
另一种方法是使用可选的链接?.运算符

const settings = map.get(Role.ROLE_1)?.(secondParameter) ?? defaultSettings;


但在语义上略有不同-它不区分缺少的键和具有显式null/undefined值的键。

相关问题