'string | undefined' 类型的参数不可分配给参数

Argument of type 'string | undefined' is not assignable to parameter

为什么此代码不起作用?

const whitelist = ['http://localhost:3000' , 'https://localhost:3443', 'http://localhost:4200','http://localhost:5000'];

const corsOptionsDelegate  =(req: Request, callback: any) => {
    let corsOptions;
    console.log('origin' + req.header('Origin'));
    if(req.header('Origin') != null){
        if(whitelist.indexOf(req.header('Origin')) !== -1){
            console.log("index : " + whitelist.indexOf(req.header('Origin')));
            corsOptions = { origin : true};
        }
        else{
            console.log('here else :' + whitelist.indexOf(req.header('Origin')));
            corsOptions = { origin : false };
        }
    }

    callback(null , corsOptions);
};

错误:

Argument of type 'string | undefined' is not assignable to parameter of type 'string'. Type 'undefined' is not assignable to type 'string'.

错误来自 (req.header('Origin')) 个括号。

whitelist 的 automatically-detected 类型是 string[] 因为您仅使用字符串作为元素对其进行了初始化。

string[] 数组的 indexOf 方法然后相应地获得签名 indexOf(searchElement: string, fromIndex?: number | undefined): number - 请注意 searchElementstring.

如果请求的header不存在,

req.header可以returnundefined,因此其return值的类型是string | undefined而不仅仅是 string.

因此,通过编写 whitelist.indexOf(req.header('Origin')),您试图将 string | undefined 传递给需要 string 的对象。

你可以通过先检查 header 是否存在然后再测试它是否被列入白名单来解决这个问题(另外,我将在这里使用 includes 而不是 indexOf 因为除了在调试日志中,你似乎并没有使用实际的索引):

const origin = req.header('Origin')
if (origin !== undefined && whitelist.includes(origin) {
  corsOptions = { origin: true }
} else {
  corsOptions = { origin: false }
}

...可以进一步简化为:

const origin = req.header('Origin')
corsOptions = { origin: origin !== undefined && whitelist.includes(origin) }

你也可以为缺失的原点使用默认值header,比如一个空字符串,这样代码就变得更简单了:

corsOptions = { origin: whitelist.includes(req.header('Origin') ?? '') }