'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
- 请注意 searchElement
是 string
.
如果请求的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') ?? '') }
为什么此代码不起作用?
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
- 请注意 searchElement
是 string
.
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') ?? '') }