如何解决 TypeScript 中 Type 'unknown' is not assignable to type 错误
当我们尝试将类型为未知的值分配给不同类型的值时,会发生“Type 'unknown' is not assignable to type”错误。 要解决该错误,请在赋值之前使用类型断言或类型保护来验证两个值是否具有兼容的类型。
下面是产生上述错误的示例。
const a: unknown = 'James';
// ⛔️ Error: Type 'unknown' is
// not assignable to type 'string'.ts(2322)
const b: string = a;
a
变量的类型未知。
这通常发生在从远程 API 获取数据时,因为 TypeScript 不知道我们正在使用的值的类型。
unknown
类型是 any
的类型安全类型。
如果我们确定特定值具有兼容类型,但 TypeScript 不知道,请使用类型断言,例如
value as RightType
。
const a: unknown = 'James';
const b: string = a as string;
当我们有关于 TypeScript 不知道的值类型的信息时,使用类型断言。
我们有效地告诉 TypeScript a 变量将是一个字符串,不用担心。
现在左侧和右侧的值具有兼容的类型,赋值不会导致错误。
另一种解决方案是使用类型保护。
const a: unknown = 'James';
let b = '';
if (typeof a === 'string') {
b = a;
}
console.log(b); // 👉️ "James"
在进行赋值之前,我们明确检查变量 a 是否存储了字符串类型的值。
TypeScript 知道一旦我们进入 if 块,变量 a 就保证是一个字符串。
当处理未知类型时,我们基本上告诉 TypeScript——我们将获得这个值,但我们不知道它的类型。 我们只是要检查几个 if 语句来跟踪它并安全地使用它。 在 if
块中,为我们提供对所检查的特定类型的支持。
下面是一个在处理对象时如何使用类型保护的例子。
const person: unknown = {
name: 'James',
country: 'Chile',
};
type Person = {
name: string;
country: string;
};
// 👇️ checks if obj has properties of Person
function isPerson(obj: any): obj is Person {
return (
typeof obj === 'object' &&
obj !== null &&
'name' in obj &&
'country' in obj
);
}
let james: Person;
if (isPerson(person)) {
// 👉️ person has type of Person here
james = person;
} else {
james = { name: '', country: '' };
}
console.log(james); // 👉️ {name: 'James', country: 'Chile'}
我们使用用户定义的类型保护来检查对象是否具有 Person 类型的所有属性。
obj is Person
语法是一个类型谓词,其中 obj 必须是函数采用的参数的名称。
如果 isPerson
函数返回 true,TypeScript 就知道传入的值是 Person
类型,并允许我们将其分配给变量。
上面的示例只是检查传入的值是否是一个对象并包含名称和国家/地区属性。
我们还必须检查 null,因为在 JavaScript(和 TypeScript)中,typeof null
返回“object”。
如果 person 变量不存储兼容类型的值,我们将使用默认值。
我们还可以在初始化变量时设置默认值。
const person: unknown = {
name: 'James',
country: 'Chile',
};
type Person = {
name: string;
country: string;
};
// 👇️ set defaults upon initialization
let james: Person = {
name: '',
country: '',
};
// 👇️ checks if obj has properties of Person
function isPerson(obj: any): obj is Person {
return (
typeof obj === 'object' &&
obj !== null &&
'name' in obj &&
'country' in obj
);
}
if (isPerson(person)) {
// 👉️ person is type Person here
james = person;
}
// 👇️ {name: 'James', country: 'Chile'}
console.log(james);
是否能够使用此方法取决于用例。
目标是确保分配的左侧和右侧的值具有兼容的类型。
下面是一个示例,说明如何使用类型保护来检查未知类型的值是否为数组。
const data: unknown = [
{
name: 'James',
country: 'Chile',
},
{
name: 'Alice',
country: 'Germany',
},
];
type Person = {
name: string;
country: string;
};
let people: Person[] = [];
if (Array.isArray(data)) {
people = data as Person[];
}
// [
// { name: 'James', country: 'Chile' },
// { name: 'Alice', country: 'Germany' }
// ]
console.log(people);
我们使用 Array.isArray()
方法在赋值之前检查数据变量是否存储了一个数组。
我们可能必须更加严格并检查数组是否有任何元素以及它们是否包含特定属性等。
总结
当我们尝试将类型为未知的值分配给不同类型的值时,会发生“Type 'unknown' is not assignable to type”错误。 要解决该错误,请在赋值之前使用类型断言或类型保护来验证两个值是否具有兼容的类型。
相关文章
在 AngularJs 中设置 Select From Typescript 的默认选项值
发布时间:2023/04/14 浏览次数:78 分类:Angular
-
本教程提供了在 AngularJs 中从 TypeScript 中设置 HTML 标记选择的默认选项的解释性解决方案。
在 Angular 中使用 TypeScript 的 getElementById 替换
发布时间:2023/04/14 浏览次数:153 分类:Angular
-
本教程指南提供了有关使用 TypeScript 在 Angular 中替换 document.getElementById 的简要说明。这也提供了在 Angular 中 getElementById 的最佳方法。
在 TypeScript 中使用 try..catch..finally 处理异常
发布时间:2023/03/19 浏览次数:181 分类:TypeScript
-
本文详细介绍了如何在 TypeScript 中使用 try..catch..finally 进行异常处理,并附有示例。
在 TypeScript 中使用 declare 关键字
发布时间:2023/03/19 浏览次数:97 分类:TypeScript
-
本教程指南通过特定的实现和编码示例深入了解了 TypeScript 中 declare 关键字的用途。
在 TypeScript 中 get 和 set
发布时间:2023/03/19 浏览次数:172 分类:TypeScript
-
本篇文章演示了类的 get 和 set 属性以及如何在 TypeScript 中实现它。
在 TypeScript 中格式化日期和时间
发布时间:2023/03/19 浏览次数:161 分类:TypeScript
-
本教程介绍内置对象 Date() 并讨论在 Typescript 中获取、设置和格式化日期和时间的各种方法。
在 TypeScript 中返回一个 Promise
发布时间:2023/03/19 浏览次数:182 分类:TypeScript
-
本教程讨论如何在 TypeScript 中返回正确的 Promise。这将提供 TypeScript 中 Returns Promise 的完整编码示例,并完整演示每个步骤。
在 TypeScript 中定义函数回调的类型
发布时间:2023/03/19 浏览次数:221 分类:TypeScript
-
本教程说明了在 TypeScript 中为函数回调定义类型的解决方案。为了程序员的方便和方便,实施了不同的编码实践指南。
在 TypeScript 中把 JSON 对象转换为一个类
发布时间:2023/03/19 浏览次数:110 分类:TypeScript
-
本教程演示了如何将 JSON 对象转换为 TypeScript 中的类。