2017-02-11 73 views
0

我已经宣布界面如下Typscript实现接口属性

interface Base { 
    required: string; 
} 

我已经实现的接口类像

class MyClass implements Base{ 
    method(): void { 
     console.log(this.required); 

    } 

} 

但我得到以下错误

严重性:“错误'message:'Class'MyClass'错误地实现了接口'Base'的 。 “MyClass”类型中缺少属性'required'。'' at:'5,7'来源:'ts'

严重性:'错误'消息:'需要属性'在类型 'MyClass'中不存在。在:“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

在JavaScript中没有任何接口,如果您从接口实现类,则需要提供所有必填字段。 –

回答

1

那怎么接口工作。如果你在接口中定义一个属性,那么你需要在你实现接口的类中定义相同的属性。如果您想使用必需的属性而不重新定义属性,则应该创建一个类并对其进行扩展。

+0

谢谢@AndrésAndrade.but它看起来没有用处声明属性在接口 – iCoders

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一定是。

您有一个接口

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,intelisense会抛出engine类型为Name的属性的错误。但是可以肯定的是,该数组中的每个对象都具有name属性,因为该数组的类型为Name,并且它具有所需的属性name

+0

谢谢@ Suren Srapyan.but它看起来没有用处声明属性在接口 – iCoders

+0

为什么没有用?您可以在代码中使用类型检测。考虑你有很多类实现了一个接口,所以你可以赋值给接口类型,以确保对象至少具有接口 –

+0

@ Suren中的属性。如果你不介意你能给我更好的示例来证明这一点。谢谢 – iCoders

1

如果您不想delcare requried: string两次使用class instate interfaceBase并扩展instate实现。

class Base { 
    required: string; 
} 

class MyClass extends Base{ 
    method(): void { 
     this.required="ddd"; 
     console.log(this.required); 
     // you can access HTMLElement 
    } 
} 

playground查看。

+0

谢谢@ Magu.but它看起来没有用处声明属性在界面 – iCoders