TypeScript 中 Error: Type 'X' has no properties in common with type 'Y' 解决方法
当我们在属性没有重叠的情况下尝试将任何内容分配给弱类型时,会出现错误“Type 'X' has no properties with type 'Y'”。 要解决该错误,需要声明任何重叠属性(如果存在)或使用类型断言。
按照惯例,我们先来看一段产生该错误的代码
interface Employee {
id?: number;
salary?: number;
}
function getEmployee(emp: Employee) {
return emp;
}
// 与 Employee 的属性没有重叠
const emp = {
name: 'James',
};
// Error: Type '{ name: string; }' has no
// properties in common with type 'Employee'.ts(2559)
getEmployee(emp);
然后我们运行上面的代码,它会产生错误 “error TS2559: Type '{ name: string; }' has no properties in common with type 'Employee'”。 具体结果如下所示
Employee 类型是一个弱类型,因为它的所有属性都是可选的。
问号用于将类型的属性标记为可选,表示该属性可以是特定类型也可以是未定义的。
Employee 类型是一个弱类型,因为我们可以创建一个符合该类型的空对象。
interface Employee {
id?: number;
salary?: number;
}
// 这是可以的
const e: Employee = {};
错误的原因是 - 我们将 emp 对象传递给一个需要 Employee 类型对象的函数,并且 emp 变量与 Employee 类型没有重叠。
解决错误的一种方法是使用类型断言。
interface Employee {
id?: number;
salary?: number;
}
function getEmployee(emp: Employee) {
return emp;
}
const emp = {
name: 'James',
};
// {name: 'James'}
getEmployee(emp as Employee); // 使用类型断言
另一种解决方案是确保 Employee 类型和 emp 对象之间存在重叠。 例如,我们可以将 name 属性添加到 Employee 类型。
interface Employee {
id?: number;
salary?: number;
name?: string; // 添加 name
}
function getEmployee(emp: Employee) {
return emp;
}
const emp = {
name: 'James',
};
// {name: 'James'}
console.log(getEmployee(emp));
我们将 name 属性添加到 Employee 类型,所以现在类型和 emp 对象之间存在重叠。这样就可以解决上面的错误,因为属性有重叠。
如果无法更改类型,则可以向对象添加重叠属性。
interface Employee {
id?: number;
salary?: number;
}
function getEmployee(emp: Employee) {
return emp;
}
const emp = {
name: 'James',
id: 0, // 添加属性 id
};
// {name: 'James'}
console.log(getEmployee(emp));
我们给emp对象添加了id属性,所以Employee类型和对象有重叠,也解决了报错。
错误 “Type 'X' has no properties in common with type 'Y'” 也可以通过使用索引签名来解决。
interface Employee {
id?: number;
salary?: number;
[key: string]: any; // added index signature
}
function getEmployee(emp: Employee) {
return emp;
}
const emp = {
name: 'James',
};
// {name: 'James'}
console.log(getEmployee(emp));
{[key: string]: any}
语法是 TypeScript 中的索引签名,当我们事先不知道类型属性的所有名称和值的形状时使用。
示例中的索引签名意味着当 Employee 类型的对象使用字符串进行索引时,它将返回任何类型的值。
我们不必使用 any
作为类型,可以更具体来制定类型从而获得更安全的保证。 但是,请注意,索引签名的类型必须是接口中所有可能类型的联合类型。
interface Employee {
id?: number;
salary?: number;
// 具有更安全的类型的索引签名
[key: string]: string | number | undefined;
}
const e: Employee = {};
function getEmployee(emp: Employee) {
return emp;
}
const emp = {
name: 'James',
};
// {name: 'James'}
console.log(getEmployee(emp));
我们指定当一个 Employee 类型的对象被一个字符串键索引时,它将返回一个字符串、数字或未定义类型的值。
这是必要的,因为我们的 id 和 salary 属性具有 number 或 undefined 类型的值(因为它们是可选的),并且 id 和 salary 也是字符串键。
这种方法消除了错误。因为 Employee 类型现在涵盖了任何字符串键,因此 Employee 类型和 emp 变量之间存在重叠
相关文章
在 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 中的类。