我有一个使用javascript的旧应用程序,但是我启动了一个新应用程序,以将.JS代码缓慢迁移到Typescript。
当.js构建成功时,我要迁移的第一个文件是配置文件。
重命名为.TS时出现此错误
/Users/xx/yy/lulo/src/adalConfig.ts
(13,54): Argument of type '{ tenant: string; clientId: string; endpoints: { api: string; }; 'apiUrl': string; cacheLocation: string; }' is not assignable to parameter of type 'AdalConfig'.
Types of property 'cacheLocation' are incompatible.
Type 'string' is not assignable to type '"localStorage" | "sessionStorage" | undefined'
文件是这样的:
import { AuthenticationContext, adalFetch, withAdalLogin } from 'react-adal';
export const adalConfig = {
tenant: 'xxxx-c220-48a2-a73f-1177fa2c098e',
clientId: 'xxxxx-bd54-456d-8aa7-f8cab3147fd2',
endpoints: {
api:'xxxxx-abaa-4519-82cf-e9d022b87536'
},
'apiUrl': 'https://xxxxx-app.azurewebsites.net/api',
cacheLocation: 'localStorage'
};
export const authContext = new AuthenticationContext(adalConfig);
export const adalApiFetch = (fetch, url, options) =>
adalFetch(authContext, adalConfig.endpoints.api, fetch, adalConfig.apiUrl+url, options);
export const withAdalLoginApi = withAdalLogin(authContext, adalConfig.endpoints.api);
答案 0 :(得分:2)
问题是adalConfig
的类型被认定为 而不是被定义为 。您可以详细了解in the docs,但这基本上意味着TypeScript 猜测该类型。简短示例:
type FooBar = 'foo' | 'bar';
const fooBar1 = 'foo'; // fooBar1: 'foo'
const fooBar2: FooBar = 'foo'; // fooBar2: FooBar
类型断言取决于很多东西,很难手动猜测 TypeScript将要断言哪种类型。不过,快速编写TS代码确实很有用。无论如何-代码中的问题是adalConfig.cacheLocation
被声明为string
,但是相反,您希望TypeScript理解其类型与"localStorage" | "sessionStorage" | undefined
兼容。
两种方法:
cacheLocation: 'localStorage' as 'localStorage'
:精确到TypeScript,cacheLocation
的类型为'localStorage'
,从而与您想要的内容兼容export const adalConfig: AdalConfig = ...
根据TypeScript的精确度,整个adalConfig
对象的类型为AdalConfig
,因此其效果基本相同致@explosion-pills和@zerkms的荣誉,他们在此问题的评论中做出了贡献
答案 1 :(得分:0)
我知道这是一个老歌,但总是有助于发布更新。您可以从 msal 库中导入配置来设置 config 变量的类型。
import { MsalAuthProvider, LoginType } from 'react-aad-msal';
import { Configuration } from 'msal';
// Msal Configurations
const config: Configuration = {
auth: {
authority: 'https://login.microsoftonline.com/',
clientId: '<YOUR APPLICATION ID>'
},
cache: {
cacheLocation:"localStorage",
storeAuthStateInCookie: true,
}
};
// Authentication Parameters
const authenticationParameters = {
scopes: [
`<your app registartion app id>/.default`
]
}
// Options
const options = {
loginType: LoginType.Popup,
tokenRefreshUri: window.location.origin + '/auth.html'
}
export const authProvider = new MsalAuthProvider(config, authenticationParameters, options)