属性“ cacheLocation”的类型不兼容

时间:2019-03-19 18:38:59

标签: javascript reactjs typescript

我有一个使用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);

2 个答案:

答案 0 :(得分:2)

问题是adalConfig的类型被认定为 而不是被定义为 。您可以详细了解in the docs,但这基本上意味着TypeScript 猜测该类型。简短示例:

type FooBar = 'foo' | 'bar';
const fooBar1 = 'foo'; // fooBar1: 'foo'
const fooBar2: FooBar = 'foo'; // fooBar2: FooBar

TypeScript playground link

类型断言取决于很多东西,很难手动猜测 TypeScript将要断言哪种类型。不过,快速编写TS代码确实很有用。无论如何-代码中的问题是adalConfig.cacheLocation被声明为string,但是相反,您希望TypeScript理解其类型与"localStorage" | "sessionStorage" | undefined兼容。

两种方法:

  1. cacheLocation: 'localStorage' as 'localStorage':精确到TypeScript,cacheLocation的类型为'localStorage',从而与您想要的内容兼容
  2. 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)