打字稿:'string | 类型的参数undefined' 不能分配给类型为 'string' 的参数

问题描述

我有嵌套数组列表的列表,我正在尝试基于数组值的过滤器。当我过滤错误时。我正在使用带有 eslint 的打字稿。

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

但是我检查了 null/undefined 值,但仍然出现错误

interface User {
  id: string;
  username?: string;
}

function getList (user:User){
  if(user.username === undefined){
    return {};
  }
  let arrayData: string[][] = [];
  arrayData = [["abcd"],["efgh"],["xyz"],["abcd","xyz"]];
 //here i have differnt logic
  const filterData = arrayData.filter(list => list.includes(user.username));
  return filterData;
}

getList({id: "123",username: "xyz"});

当我使用 non-null assertion operator 时,错误解决,但出现 lint 问题。

const filterData = arrayData.filter(list => list.includes(user.username!));

谁能帮我解决这个问题。

解决方法

您正在比较用户 .username,这是可选的,这意味着它的类型为 string | undefined 到数组中的每个 string 项目,

您可以将数组的类型更改为:arrayData: Array<Array<string|undefined>> 或者您可以仅使用 as 将其视为 string,而不是 string|undefined:即:{{ 1}}

,

您可以像这样声明用户名:

username?: string | undefined;

,

当你想设置一个已经有类型的变量时|未定义,并且 setter 不接受任何类型 |未定义,您可以使用 !在变量的末尾 例如:

像你这样的界面

interface User { id: int; username?: string }

有一个像

这样的变量

let userVariable = 'Terminator3000'

你可以做到

user: User = { id: 123,username: userVariable! }

!运算符表示该值不是未定义的