类型“string”不可分配给 TypeScript 中的类型

类型“string”不能分配给 TypeScript 中的类型

Type ‘string’ is not assignable to type in TypeScript

“Type ‘string’ is not assignable to type” TypeScript 错误发生在我们尝试将 type 的值分配给string需要不同类型的东西时,例如更具体的字符串文字类型或枚举。要解决错误,请使用 const 或类型断言。

这是错误如何发生的第一个示例。

索引.ts
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,我们得到了错误。

TypeScript 告诉我们,当其中一个字符串文字or是预期的时string类型太宽泛。draftread unread

要解决该错误,请使用
类型断言
将字符串转换为 类型
EmailStatus

索引.ts
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值的类型具有更多的潜在
值。
EmailStatus3

让我们看一下错误是如何发生的另一个例子。

索引.ts
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或使用类型断言。

索引.ts
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

让我们看一下错误是如何发生的另一个例子。

索引.ts
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 断言

索引.ts
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如果您必须更改数组的内容,这可能不是您想要的。

一种更通用的方法是使用类型断言,就像我们在前面的示例中所做的那样。

索引.ts
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.

错误的另一个常见原因是使用

带有硬编码字符串的
枚举。

索引.ts
export enum EmailStatus { Read = 'READ', Unread = 'UNREAD', Draft = 'DRAFT', } // ⛔️ Type '"READ"' is not assignable // to type 'EmailStatus'.ts(2322) const status: EmailStatus = 'READ';

解决这个问题的最好方法是尽可能访问枚举的特定属性。

索引.ts
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 或类型断言。