目录
Argument of type ‘string or undefined’ is not assignable to parameter of type string
如果出现错误“字符串类型的参数 | 未定义的参数不能分配给字符串类型的参数”,请单击第二个小标题。
类型“string or undefined”不可分配给类型 string
当将可能的undefined
值分配给需要
string
.
string
要解决该错误,请在赋值之前使用非空断言运算符或类型保护来验证该值是否为 a 。
以下是错误发生方式的示例。
interface Employee { id: number; name?: string; // 👈️ optional (might be undefined) salary: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; // ⛔️ Error: Type 'string | undefined' is not assignable to type 'string'. // Type 'undefined' is not assignable to type 'string'.ts(2322) const name: string = emp.name;
string
或一个值。 undefined
该name
变量的类型为 a string
,因此它只期望分配一个 a 值string
。
emp.name
属性的值可能undefined
与只需要. name
string
使用非空断言运算符解决错误
解决该错误的一种方法是使用非空断言运算符。
interface Employee { id: number; name?: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const name: string = emp.name!; // 👈️ non-null assertion
感叹号是
TypeScript 中的非空断言运算符。
null
and而不进行任何显式类型检查。undefined
当你使用这种方法时,你基本上告诉 TypeScript 这个值永远不会是null
or undefined
。
使用类型保护来解决错误
另一种更好的方法是使用
类型保护。
interface Employee { id: number; name?: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; const name: string = emp.name !== undefined ? emp.name : ''; console.log(name); // 👉️ "Bobby Hadz"
我们使用
三元运算符来检查name
属性是否不等于undefined
。
如果属性不等于undefined
,它将被分配给name
变量,否则,我们使用空字符串作为后备。
name
变量总是会被分配一个字符串,即使emp.name
是undefined
。使用空合并运算符 (??) 解决错误
您还可以使用
空合并运算符 (??)
来解决该错误。
interface Employee { id: number; name?: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; const name: string = emp.name ?? ''; console.log(name); // 👉️ "Bobby Hadz"
null
或时的回退undefined
。因此,如果emp.name
isnull
或undefined
,我们将name
变量设置为空字符串。
使用逻辑或(||)运算符来解决错误
您还可以
以类似的方式使用逻辑 OR (||)运算符。
interface Employee { id: number; name?: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; const name: string = emp.name || ''; console.log(name); // 👉️ "Bobby Hadz"
如果左侧的值为假,则逻辑 OR (||) 运算符返回右侧的值。
null
和undefined
。如果左侧的值是以下任一值,则逻辑 OR (||) 运算符将返回右侧的值:null
、undefined
、false
、0
、""
(空字符串)、NaN
(非数字)。
使用if
语句解决错误
即使是充当类型保护的简单if
语句也可以用来解决该错误。
interface Employee { id: number; name?: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; let name = ''; // 👇️ emp.name is a string or undefined here if (emp.name !== undefined) { // 👇️ emp.name is string here name = emp.name; } console.log(name); // 👉️ "Bobby Hadz"
我们使用let
关键字将name
变量初始化为空字符串。
在if
语句中,我们检查emp.name
属性是否不等于
undefined
并将name
变量分配给相应的值。
使用类型断言来解决错误
如果以上方法都不起作用,您可以使用
类型断言。
interface Employee { id: number; name?: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; const name: string = emp.name as string; // 👈️ type assertion console.log(name); // 👉️ "Bobby Hadz"
我们有效地告诉 TypeScript 这emp.name
将是一个string
并且不用担心。
使用所需的实用程序类型来解决错误
您还可以通过使用Required
实用程序类型根据需要标记对象的所有属性来解决该错误。
interface Employee { id: number; name?: string; // 👈️ optional (might be undefined) salary: number; } const emp: Required<Employee> = { id: 1, name: 'Bobby Hadz', salary: 100, }; const name: string = emp.name; console.log(name);
我们使用“Required”实用程序类型来构造一个新类型,并将所提供类型的所有属性设置为“required”。
该name
属性在新类型中不再是可选的,因此它永远不能存储值undefined
。
“字符串或未定义”类型的参数不可分配给字符串类型的参数
当将可能的undefined
值传递给需要string
.
string
要解决该错误,请在将值传递给函数之前使用类型保护来验证该值是否为 a 。
以下是错误发生方式的示例。
function getMessage(message: string) { return message; } // 👇️ const message: "Greetings" | undefined const message = Math.random() > 0.5 ? 'Greetings' : undefined; // ⛔️ Error: Argument of type 'string | undefined' is not // assignable to parameter of type 'string'. // Type 'undefined' is not assignable to type 'string'. ts(2345) getMessage(message);
该函数期望使用类型参数来调用,string
但传入的参数可能是undefined
。
undefined
与函数参数的类型不兼容,该参数必须是string
.在函数调用中使用非空断言
解决这个问题的一种方法是使用非空断言。
function getMessage(message: string) { return message; } // 👇️ const message: "Greetings" | undefined const message = Math.random() > 0.5 ? 'Greetings' : undefined; getMessage(message!); // 👈️ non-null assertion
感叹号是
TypeScript 中的非空断言运算符。
undefined
and而不进行任何显式类型检查。null
当你使用这种方法时,你基本上告诉 TypeScript 这个值永远不会是undefined
or null
。
在函数调用中使用类型断言
这与
类型断言非常相似
,仅当您完全确定该值属于预期类型时才应使用。
function getMessage(message: string) { return message; } // 👇️ const message: "Greetings" | undefined const message = Math.random() > 0.5 ? 'Greetings' : undefined; getMessage(message as string); // 👈️ type assertion
我们有效地告诉 TypeScript 该message
变量存储一个字符串,而不必担心它。
使用三元运算符解决错误
另一种更好的方法是使用
类型保护。
function getMessage(message: string) { return message; } // 👇️ const message: "Greetings" | undefined const maybeMessage = Math.random() > 0.5 ? 'Greetings' : undefined; const message: string = maybeMessage !== undefined ? maybeMessage : ''; getMessage(message);
我们使用
三元运算符来检查maybeMessage
变量是否不等于undefined
。
如果它不等于undefined
,它将被分配给message
变量,否则,我们使用空字符串作为后备。
message
变量总是会被分配一个字符串,即使maybeMessage
变量是. undefined
在函数调用中使用空合并运算符 (??)
您还可以使用
空合并运算符 (??)
来解决该错误。
function getMessage(message: string) { return message; } // 👇️ const message: "Greetings" | undefined const maybeMessage = Math.random() > 0.5 ? 'Greetings' : undefined; getMessage(maybeMessage ?? ''); // 👈️ nullish coalescing
undefined
或时的回退null
。如果maybeMessage
变量是undefined
or null
,我们将空字符串参数传递给函数。
在函数调用中使用逻辑或(||)运算符
您还可以
以类似的方式使用逻辑 OR (||)运算符。
function getMessage(message: string) { return message; } // 👇️ const message: "Greetings" | undefined const maybeMessage = Math.random() > 0.5 ? 'Greetings' : undefined; getMessage(maybeMessage || '');
如果左侧的值为假,则逻辑 OR (||) 运算符返回右侧的值。
undefined
和null
。如果左侧的值是以下任一值,则逻辑 OR (||) 运算符将返回右侧的值:null
、undefined
、false
、0
、""
(空字符串)、NaN
(非数字)。
更新函数参数的类型
错误原因是函数参数的类型和传入参数的类型不兼容。
根据您的用例,您还可以通过更新函数参数的类型
并使参数和传入的参数类型兼容来解决错误
。
// 👇️ parameter is type string or undefined function getMessage(message: string | undefined) { return message; } // 👇️ argument is also type string or undefined const maybeMessage = Math.random() > 0.5 ? 'Greetings' : undefined; getMessage(maybeMessage);
该函数的参数现在的类型为string
or undefined
,因此我们可以向其传递string
or类型的参数undefined
,因为这两种类型是兼容的。
我们在示例中使用了联合类型,但我们也可以将参数标记为可选。
function getMessage(message?: string) { // 👈️ optional return message; } // 👇️ argument is also type string or undefined const maybeMessage = Math.random() > 0.5 ? 'Greetings' : undefined; getMessage(maybeMessage);
代码示例实现了相同的结果。当参数被标记为可选时,它可以是指定的类型或具有值undefined
。
额外资源
您可以通过查看以下教程了解有关相关主题的更多信息: