Javascript 对象可能未定义,不接受带问号的对象

Javascript 对象可能未定义,不接受带问号的对象,javascript,typescript,Javascript,Typescript,考虑以下ocde: app-config.json authService.js 从'src/services/utils/utilsService'导入{isInternetExplorer} 从“Msal”导入*作为Msal 从'src/app config.json'导入*作为configJson 类型resourceType={ resourceUri:字符串 resourceScope:string | string[] } 类型resourcesType={ [键:字符串]:reso

考虑以下ocde:

app-config.json

authService.js

从'src/services/utils/utilsService'导入{isInternetExplorer} 从“Msal”导入*作为Msal 从'src/app config.json'导入*作为configJson 类型resourceType={ resourceUri:字符串 resourceScope:string | string[] } 类型resourcesType={ [键:字符串]:resourceType } 接口JsonConfigInterface扩展了Msal.Configuration{ 范围:{ loginRequest:string[] } 资源:resourcesType } const config:jsonconfig接口=将JSON配置为jsonconfig接口 函数MSALConfigFactory:Msal.Configuration{ 返回{ 认证:{ clientId:config.auth.clientId, }, 缓存:{ cacheLocation?:将.cache.cacheLocation配置为Msal.cacheLocation, }, } } cacheLocation?:config.cache.cacheLocation as Msal.cacheLocation报告的错误为:

属性缓存?:缓存选项|未定义的对象可能是 “未定义”。ts2532

当你看报纸时,上面写着:

导出类型CacheLocation=localStorage | sessionStorage; 导出类型缓存选项={ cacheLocation?:cacheLocation; StoreAuthStateInokie?:布尔值; }; 缓存位置中的问号?指示此参数是可选的,可以。它可以在JSON文件中定义,也不能在JSON文件中定义。所以我不明白为什么TypeScript抱怨它可以不定义,而这是一个可接受的值?当然,TS null检查已经到位,但它是否应该不允许这样做,因为有一个问号

目前的解决方法如下,但我不知道这是否是正确的方法:

//eslint禁用下一行@typescript eslint/无非空断言 cacheLocation:config.cache!。cacheLocation作为Msal.cacheLocation,
我还是个初学者,谢谢你的帮助

Typescript试图告诉您此属性访问可能会导致错误:

config.cache.cacheLocation
如果config或config.cache结果未定义,将引发异常

您可以这样做:

config?.cache?.cacheLocation
似乎是这样的类型:

export type Configuration = {
    auth?: BrowserAuthOptions,
    cache?: CacheOptions,
    system?: BrowserSystemOptions
};

谢谢,这似乎合乎逻辑。您能详细说明一下为什么没有为clientId:config.auth.clientId生成错误吗,?在这种情况下,配置也可以是不存在的,对吗?我不知道,我需要查看Msal.Configuration接口。但由于另一个接口没有错误,这意味着配置不能是未定义的,只能是缓存,所以这就足够了:config.cache?.cacheLocation
export type Configuration = {
    auth?: BrowserAuthOptions,
    cache?: CacheOptions,
    system?: BrowserSystemOptions
};