Typescript实现接口属性

时间:2017-02-11 06:43:05

标签: javascript jquery angularjs angular typescript

我已声明接口如下

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();

3 个答案:

答案 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')];

此处arrName类型的数组。因此,如果您获得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中查看。