我已声明接口如下
interface Base {
required: string;
}
我在类中实现了接口,如
class MyClass implements Base{
method(): void {
console.log(this.required);
}
}
但我收到了以下错误
严重性:'错误'消息:'Class'MyClass'错误地实现 界面'基地'。 “MyClass”类型中缺少“必需”属性。 at:'5,7'来源:'ts'
严重性:'错误'消息:类型中不存在'必需属性' '我的课'。' at:'7,26'来源:'ts'
如果我在课堂上再次宣布required: string;
,那么就没有错误
interface Base {
required: string;
}
class MyClass implements Base{
required: string;
method(): void {
this.required="ddd";
console.log(this.required);
// you can access HTMLElement
}
}
var ss=new MyClass();
ss.method();
答案 0 :(得分:1)
这就是接口的工作原理。如果在接口中定义属性,则需要在要实现接口的类中定义相同的属性。如果您想在不重新定义属性的情况下使用必需属性,则应创建一个扩展它的类。
答案 1 :(得分:1)
您的错误是正确的。如果您的class
实施interface
,则还必须实施所有必需的属性和方法。如果您不想实现某些属性或方法,可以使用optional
符号将其声明为?
。
interface Base {
required: string;
someProperty?: string; // << look at the symbol `?` in the end of the property
}
您可以在此处实现界面并离开someProperty
class MyClass implements Base{
required: string;
// someProperty is missing here, because it is optional
method(): void {
this.required="ddd";
console.log(this.required);
// you can access HTMLElement
}
}
不仅可以实现接口。您也可以将它们用作类型。如果你有一个界面
interface Base {
required: string;
}
您可以创建一个对象,该对象是该接口的类型
const obj: Base = { };
但是在这里你会收到一个错误,因为如果你的对象是Base
类型,你需要提供所有必需的属性。所以你需要写
const obj: Base = { required: 'Yes' };
这将保护您的代码免受逻辑错误的影响,并且您的代码也将为对象强类型,您不想为其创建类,但您想要说明它必须是shape
。< / p>
示例强>
你有一个界面
interface Name {
name: string
}
并有课程
class Car implements Name {
name: string;
engine: string
constructor(name: string, engine: string){
this.name = name;
this.engine = engine;
}
}
class Person implements Name {
name: string;
surname: string;
constructor(name: string, surname: string){
this.name = name;
this.surname = surname;
}
}
var arr: Name = [new Car('Car', 'JZ'), new Person('Name', 'Surname')];
此处arr
是Name
类型的数组。因此,如果您获得arr[0]
并对其进行调用.engine
,则智能感知会在类型engine
中抛出错误,表明没有Name
属性。但是您可以确定,该数组中的每个对象都具有name
属性,因为该数组的类型为Name
且它具有必需属性name
。
答案 2 :(得分:1)
如果您不希望del requried: string
两次使用class
interface
Base
class Base {
required: string;
}
class MyClass extends Base{
method(): void {
this.required="ddd";
console.log(this.required);
// you can access HTMLElement
}
}
并延长instate implements。
<resources>
<style name="Theme.Sample" parent="Theme.AppCompat">
<item name="android:colorBackground">@color/primary_material_dark</item>
<item name="actionBarTheme">@color/colorGray</item>
</style>
</resources>
在playground中查看。