类型“string”不能分配给 TypeScript 中的类型
Type ‘string’ is not assignable to type in TypeScript
“Type ‘string’ is not assignable to type” TypeScript 错误发生在我们尝试将 type 的值分配给string
需要不同类型的东西时,例如更具体的字符串文字类型或枚举。要解决错误,请使用 const 或类型断言。
这是错误如何发生的第一个示例。
type EmailStatus = 'draft' | 'read' | 'unread'; // 👇️ status has type `string` let status = 'draft'; status = 'read'; // ⛔️ Error: Type 'string' is not // assignable to type 'EmailStatus'.ts(2322) const current: EmailStatus = status; console.log(current);
status
变量的类型为,string
变量current
的类型为EmailStatus
。
当我们尝试将字符串分配给期望值为 type 的变量时
EmailStatus
,我们得到了错误。
string
类型太宽泛。draft
read
unread
要解决该错误,请使用
类型断言
将字符串转换为 类型EmailStatus
。
type EmailStatus = 'draft' | 'read' | 'unread'; // 👇️ type is EmailStatus (not string) let status = 'draft' as EmailStatus; // 👈️ use type assertion status = 'read'; const current: EmailStatus = status; console.log(current); // 👉️ "read"
我们使用类型断言来更改解决错误的status
变量
的类型。EmailStatus
发生错误的原因是,该类型比仅涵盖字符串文字string
值的类型具有更多的潜在
值。EmailStatus
3
让我们看一下错误是如何发生的另一个例子。
type Letter = 'a' | 'b'; const arr: Letter[] = ['a', 'b']; const obj: { letter: string } = { letter: 'a', }; // ⛔️ Argument of type 'string' is not // assignable to parameter of type 'Letter'.ts(2345) arr.push(obj.letter);
对象中的letter
属性类型为string
,数组只需要类型为 的字符串Letter
。
要解决该错误,letter
请将对象中属性的类型更改为
Letter
或使用类型断言。
type Letter = 'a' | 'b'; const arr: Letter[] = ['a', 'b']; const obj: { letter: string } = { letter: 'a', }; arr.push(obj.letter as Letter); // 👈️ type assertion
我们使用类型断言来绕过错误。letter
但是,如果我们可以直接将对象中的属性键入为 ,那就更好了Letter
。
让我们看一下错误是如何发生的另一个例子。
type EmailStatus = 'draft' | 'read' | 'unread'; // 👇️ type is string[] const arr2 = ['unread']; const arr3: EmailStatus[] = ['draft', 'read']; // ⛔️ Error: Type 'string[]' is not // assignable to type 'EmailStatus[]'. const arr4: EmailStatus[] = [...arr2, ...arr3];
该arr2
变量的类型为string[]
,而arr4
具有更具体的类型EmailStatus[]
。
解决该错误的一种方法是使用
const 断言。
type EmailStatus = 'draft' | 'read' | 'unread'; // 👇️ type is readonly ["unread"] const arr2 = ['unread'] as const; const arr3: EmailStatus[] = ['draft', 'read']; const arr4: EmailStatus[] = [...arr2, ...arr3];
as const
语法将数组转换为包含单个字符串 – 的只读元组unread
。如果您必须更改数组的内容,这可能不是您想要的。一种更通用的方法是使用类型断言,就像我们在前面的示例中所做的那样。
type EmailStatus = 'draft' | 'read' | 'unread'; // 👇️ type is EmailStatus[] const arr2 = ['unread'] as EmailStatus[]; const arr3: EmailStatus[] = ['draft', 'read']; const arr4: EmailStatus[] = [...arr2, ...arr3];
现在arr2
变量被键入,EmailStatus[]
所以我们可以将它解压到
arr4
.
错误的另一个常见原因是使用
带有硬编码字符串的枚举。
export enum EmailStatus { Read = 'READ', Unread = 'UNREAD', Draft = 'DRAFT', } // ⛔️ Type '"READ"' is not assignable // to type 'EmailStatus'.ts(2322) const status: EmailStatus = 'READ';
解决这个问题的最好方法是尽可能访问枚举的特定属性。
export enum EmailStatus { Read = 'READ', Unread = 'UNREAD', Draft = 'DRAFT', } // ✅ Solution 1 const status: EmailStatus = EmailStatus.Read; // ✅ Solution 2 const status2: EmailStatus = 'READ' as EmailStatus;
如果出于某种原因,您无法访问枚举的属性,请使用类型断言。
尝试将硬编码字符串与枚举一起使用是导致该错误的常见原因。
结论
“Type ‘string’ is not assignable to type” TypeScript 错误发生在我们尝试将 type 的值分配给string
需要不同类型的东西时,例如更具体的字符串文字类型或枚举。要解决错误,请使用 const 或类型断言。