TypeScript 中 Class incorrectly implements interface 错误

news2024/12/22 18:52:46

当一个类在没有指定接口上定义的所有属性和方法的情况下实现接口时,会发生错误“Class incorrectly implements interface”。 要解决该错误,需要确保定义并键入接口的所有必需属性和方法。

下面是产生上述错误的示例代码

interface Employee {
  id: number;
  name: string;
  tasks: string[];
  address: {
    country: string;
    city: string;
  };
  doWork(): void;
}

// ⛔️ Error: Class 'Developer' incorrectly implements interface 'Employee'.
// Property 'doWork' is missing in type
// 'Developer' but required in type 'Employee'.ts(2420)
class Developer implements Employee {
  constructor(
    public id: number,
    public name: string,
    public tasks: string[],
    public address: { country: string; city: string },
  ) {
    this.id = id;
    this.name = name;
    this.tasks = tasks;
    this.address = address;
  }

  // 👇️ did not implement method
  // doWork(): void {
  //   console.log(`${this.name} writes code`);
  // }
}

上面示例中的问题是,在使用 implements 子句时,我们必须确保类满足接口。

该类必须定义接口指定的所有属性和方法。

示例中的错误消息指出类型 Developer 中缺少属性 doWork,这很有帮助。

要解决上面示例中的错误,我们必须在类中定义 doWork()方法。

interface Employee {
  id: number;
  name: string;
  tasks: string[];
  address: {
    country: string;
    city: string;
  };
  doWork(): void;
}

class Developer implements Employee {
  constructor(
    public id: number,
    public name: string,
    public tasks: string[],
    public address: { country: string; city: string },
  ) {
    this.id = id;
    this.name = name;
    this.tasks = tasks;
    this.address = address;
  }

  doWork(): void {
    console.log(`${this.name} writes code`);
  }
}

如果我们的类不希望在初始化时将特定值作为参数,请使用类属性。

interface Employee {
  id: number;
  name: string;
  tasks: string[];
  address: {
    country: string;
    city: string;
  };
  doWork(): void;
}

class Developer implements Employee {
  tasks: string[] = ['dev', 'test'];
  address: { country: string; city: string } = {
    country: 'Germany',
    city: 'Hamburg',
  };

  constructor(public id: number, public name: string) {
    this.id = id;
    this.name = name;
  }

  doWork(): void {
    console.log(`${this.name} writes code`);
  }
}

const dev = new Developer(1, 'Tom');

console.log(dev.tasks); // 👉️ ['dev', 'test']

上面的示例同时使用了类属性和构造函数方法,并正确地实现了接口。

Class incorrectly implements interface” 错误的一个非常常见的原因是指定嵌套在类中的对象中的接口的属性。

interface Employee {
  id: number;
  name: string;
}

// ⛔️ Class 'Developer' incorrectly implements interface 'Employee'.
// Type 'Developer' is missing the following
// properties from type 'Employee': id, name ts(2420)
class Developer implements Employee {
  constructor(public props: { id: number; name: string }) {
    this.props = props;
  }
}

Employee 类型有一个 idname 属性,但是我们在类中定义了一个 props 字段,它是一个具有 idname 属性的对象。

相反 ,我们应该在类上定义 idname 属性,而不是将它们嵌套在对象中。

interface Employee {
  id: number;
  name: string;
}

class Developer implements Employee {
  constructor(public id: number, public name: string) {
    this.id = id;
    this.name = name;
  }
}

请注意implements 子句的目的只是检查该类是否可以被视为接口类型。

implements 子句不会更改类的类型或其方法。

interface Employee {
  sum(a: number, b: number): number;
}

class Developer implements Employee {
  // ⛔️ Parameter 'a' implicitly has an 'any' type.ts(7006)
  // ⛔️ Parameter 'b' implicitly has an 'any' type.ts(7006)
  sum(a, b){
    return a + b;
  }
}

即使该类实现了为 sum 函数定义类型的 Employee 接口,该类中的 sum 方法也不会自动进行类型化。

这是因为 implements 子句不会更改类的类型。

interface Employee {
  id: number;
  name?: string; // 👈️ optional property
}

class Developer implements Employee {
  constructor(public id: number) {
    this.id = id;
  }
}

const dev = new Developer(1);

// ⛔️ Error: Property 'name' does not exist on type 'Developer'.ts(2339)
console.log(dev.name);

如果你实现一个带有可选属性的接口,它不会在类中自动创建。

我们使用问号在 Employee 接口中将 name 属性设置为可选。

这意味着它可以是字符串或具有未定义的值。

Developer 类正确地实现了 Employee 接口,因为 name 属性不是必需的,但是,该属性不会自动分配给该类。


总结

当一个类在没有指定接口上定义的所有属性和方法的情况下实现接口时,会发生错误“Class incorrectly implements interface”。 要解决该错误,需要确保定义并键入接口的所有必需属性和方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux学习记录——유 gcc/g++基础知识

文章目录一、程序翻译二、gcc使用1、-o2、预处理-E3、编译-S4、汇编-c5、链接三、库四、库的部分实际操作五、Linux项目自动化构建工具 make/Makefile1、规则一、程序翻译 C语言中,写出代码后,编译器会经过四个阶段才会生成可执行文件。 预处理&#x…

计算数组中元素的加权平均值 numpy.average()

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】计算数组中元素的加权平均值numpy.average()[太阳]选择题对于以下python代码最后输出的结果是?import numpy as npa np.array([1, 2, 3, 4])print("【显示】a")print(a)print("…

如何进行Java 单元测试

什么是单元测试 维基百科中是这样描述的:在计算机编程中,单元测试又称为模块测试,是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;…

架构师课程笔记day04——Nginx

大纲 1.从单体到集群过渡 2.Nginx 2.1什么是nginx 2.2常见服务器 2.3nginx在架构中所处位置 2.4使用率,性能,市场占有率等信息 2.5正反向代理啥意思 正向代理 反向代理 示例 2.6安装步骤 Nginx安装步骤 常用命令等 2.7请求链路 2.8进程模型 通用模型 …

JS面向对象基础(原型链、构造函数、new关键字、寄生组合继承、对象元编程)

这篇文章将简单介绍面向对象的基本概念,以及JS语言是如何支持面向对象这种编程范式的,最后还会讲解一些对象元编程的基础知识。通过阅读这篇文章,你可以了解JS中的原型链机制,new和构造函数的原理、寄生组合继承的实现以及对象元编…

李群李代数学习笔记

前言 因为论文学习的需要,入门了一下李群和李代数,觉得B站的这个视频讲得不错:视频地址为机器人学——李群、李代数快速入门,这里记录一下。 前言引入:一些常见的例子S1S^1S1:单位复数SO(2)SO(2)SO(2)&…

ArcGIS基础实验操作100例--实验64创建统计图符号

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验64 创建统计图符号 目录 一、实验背景 二、实验数据 三、实验步骤 (1&am…

24考研数学复习方法、全年规划

文章目录各个阶段推荐的辅导书和习题1.教材基础:22年9月-23年3月复习“三基”2.强化阶段:23年4月-23年8月3.真题阶段:23年9月-10月4.冲刺模拟阶段:23年11-12月各个阶段推荐的辅导书和习题 阶段(时间)辅导教材习题册1.基础阶段(1-…

Vue初识系列【2】内容升级版

文章目录一 模板语法1.1 文本1.2 原始THTML1.3 属性Attribute1.4 JavaScript表达式的使用二 条件渲染2.1 v−if&v−elsev-if\&v-elsev−if&v−else2.2 v−showv-showv−show2.3 v−ifv-ifv−if与v−showv-showv−show的区别三 列表渲染3.1 v−forv-forv−for列表渲…

OpenSceneGraph几何基础教程【OSG】

默认情况下,OSG 使用顶点数组法和显示列表法来渲染几何体。 但是,渲染策略可能会发生变化,具体取决于几何数据的呈现方式。 在本文中,我们将了解在 OSG 中处理几何体的基本技术。 OpenSceneGraph 后端的 OpenGL 使用几何图元&…

Typora 图床教程(阿里云版)

由于码云现在需要登录才能看到相关图片文件后,导致我们已经不能愉快的使用它作为图床了,所以我们需要使用其他工具来作为图床使用了,本文使用阿里云OSS作为Typora的图床。 阿里云OSS相较于其他几个方法来说最大的优点就是稳定了,…

《图机器学习》-Machine Learning for Graphs

Machine Learning for Graphs一、Application of Graph ML一、Application of Graph ML 图机器学习的任务可以分为四个类型: NodelevelNode\ levelNode level(结点级别)EdgelevelEdge\ levelEdge level(边级别)Community(subgraph)levelCommunity(subgraph)\ level…

【rpm】源码包制作rpm包|修改rpm、重新制作rpm包

目录 前言 安装rpmbuild rpmbuild制作rpm 包 同时生成devel包 修改rpm、重新制作rpm包 RPM 打包 工具 SPEC文件 rpmbuild的目录和Spec宏变量和参数说明 preamble部分 Body 部分 标题宏变量/工作目录 spec文件信息 符号说明 CMake制作rpm包 HelloWorld 更多SPEC…

微信小程序开发——小程序的宿主环境—组件

一.小程序的宿主环境—组件1.小程序中组件的分类小程序中的组件也是由宿主环境提供的,开发者可以基于组件快速搭建出漂亮的页面结构。官方把小程序的组件分为了9大类,分别是:1.视图容器 2.基础内容 3.表单组件 4.导航组件5.媒体组件 6.map 地…

企业寄件管理系统使用教程

专为企业量身打造的寄件管理类平台,也就是企业寄件管理系统。其存在的意义在哪里?又是如何运用的?我们往下看看......讨论它存在的意义在哪里,我们先来看看企业普遍存在的寄件场景痛点:1、最早的手写快递单&#xff0c…

一维差分(例acwing重新排序)

一维差分是为了解决访问一个数组中的几个区间,降低时间复杂度使用的差分就是前缀和的逆运算(a[i]b[1]b[2]…b[i])差分的作用就是快速实现将数组部分加上一个数。例如给定一个数组 A 和一些查询 Li,Ri,求数组中第 Li 至第 Ri 个元素…

Maven高级-属性-版本管理-资源配置-多环境开发配置-跳过测试

Maven高级-属性 4.2)属性类别 1.自定义属性 2.内置属性 3.Setting属性 4.Java系统属性 5.环境变量属性 4.3)属性类别&#xff1a;自定义属性 作用 等同于定义变量&#xff0c;方便统一维护 定义格式&#xff1a; <!--定义自定义属性--> <properties><…

STM32MP157驱动开发——Linux ADC驱动

STM32MP157驱动开发——Linux ADC驱动0.前言一、ADC 简介1.ADC 简介2.STM32MP157 ADC简介二、ADC 驱动源码解析1.设备树下的 ADC 节点2.ADC 驱动源码分析1&#xff09;stm32_adc 结构体2&#xff09;stm32_adc_probe 函数3&#xff09;stm32_adc_iio_info 结构体三、驱动开发1.…

【深度学习】经典算法解读及代码复现AlexNet-VGG-GoogLeNet-ResNet(二)

链接: 【深度学习】经典算法解读及代码复现AlexNet-VGG-GoogLeNet-ResNet(一) 4.GoogLeNet 4.1.网络模型 GoogLeNet的名字不是GoogleNet&#xff0c;而是GoogLeNet&#xff0c;这是为了致敬LeNet。GoogLeNet和AlexNet/VGGNet这类依靠加深网络结构的深度的思想不完全一样。Go…

创建Vue3项目以及引入Element-Plus

创建Vue3项目以及引入Element-Plus 前提条件&#xff1a;本地需要有node环境以及安装了npm&#xff0c;最好设置了镜像&#xff0c;这样下载包的时候会快些。 1、安装vue脚手架vue-cli3 npm install vue/cli -g2、安装后查看vue的版本 vue -V3、创建Vue项目&#xff0c;项目…