Javascript 实现接口属性的类型脚本

Javascript 实现接口属性的类型脚本,javascript,jquery,angularjs,angular,typescript,Javascript,Jquery,Angularjs,Angular,Typescript,我已经声明了如下接口 interface Base { required: string; } 我在类中实现了接口,如 class MyClass implements Base{ method(): void { console.log(this.required); } } 但我有以下错误 严重性:“错误”消息:“类“MyClass”未正确实现 接口“基”。类型“MyClass”中缺少属性“required” 在:'5,7'来源:'ts' 严重性:

我已经声明了如下接口

interface Base {
    required: string;
}
我在类中实现了接口,如

class MyClass implements Base{
    method(): void {
        console.log(this.required);
    }
}
但我有以下错误

严重性:“错误”消息:“类“MyClass”未正确实现 接口“基”。类型“MyClass”中缺少属性“required” 在:'5,7'来源:'ts'

严重性:“错误”消息:“属性”required“在类型上不存在 “MyClass.”位于:“7,26”来源:“ts”

如果我声明
必需:字符串再次在课堂上,然后没有错误

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

接口就是这样工作的。如果在接口中定义属性,则需要在实现接口的类中定义相同的属性。如果您希望在不重新定义属性的情况下使用required属性,则应创建一个类并对其进行扩展。

接口就是这样工作的。如果在接口中定义属性,则需要在实现接口的类中定义相同的属性。如果您想在不重新定义属性的情况下使用required属性,则应创建一个类并对其进行扩展。

您的错误是正确的。如果您的
实现了一个
接口
,那么它还必须实现所有所需的属性和方法。如果不想实现某些属性或方法,可以使用
符号将它们声明为
可选

interface Base {
    required: string;
    someProperty?: string; // << look at the symbol `?` in the end of the property
}
而且不仅可以实现接口。也可以将它们用作类型。如果你有一个接口

interface Base {
   required: string;
}
const obj: Base = { };
interface Name {
   name: string
}
可以创建该接口类型的对象

interface Base {
   required: string;
}
const obj: Base = { };
interface Name {
   name: string
}
但在这里您将得到一个错误,因为如果您的对象是
Base
类型,则需要提供所有必需的属性。所以你需要写作

const obj: Base = { required: 'Yes' };
这将保护您的代码不受逻辑错误的影响,并且您的代码对于对象也是强类型的,您不想为其创建类,但希望说明它必须是什么
shape

示例

你有一个接口

interface Base {
   required: string;
}
const obj: Base = { };
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
,IntelisSense将抛出一个错误,即type
Name
中没有
engine
属性。但是您可以确定,该数组中的每个对象都有
name
属性,因为该数组的类型是
name
,并且它有一个必需的属性
name

,您的错误是正确的。如果您的
实现了一个
接口
,那么它还必须实现所有所需的属性和方法。如果不想实现某些属性或方法,可以使用
符号将它们声明为
可选

interface Base {
    required: string;
    someProperty?: string; // << look at the symbol `?` in the end of the property
}
而且不仅可以实现接口。也可以将它们用作类型。如果你有一个接口

interface Base {
   required: string;
}
const obj: Base = { };
interface Name {
   name: string
}
可以创建该接口类型的对象

interface Base {
   required: string;
}
const obj: Base = { };
interface Name {
   name: string
}
但在这里您将得到一个错误,因为如果您的对象是
Base
类型,则需要提供所有必需的属性。所以你需要写作

const obj: Base = { required: 'Yes' };
这将保护您的代码不受逻辑错误的影响,并且您的代码对于对象也是强类型的,您不想为其创建类,但希望说明它必须是什么
shape

示例

你有一个接口

interface Base {
   required: string;
}
const obj: Base = { };
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
,IntelisSense将抛出一个错误,即type
Name
中没有
engine
属性。但是您可以确定,该数组中的每个对象都有
name
属性,因为该数组的类型是
Name
,并且如果您不想删除
required,它有一个必需的属性
Name

:string
两次为
Base
使用
instate
接口
,并扩展instate实现

class Base {
    required: string;
}

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

如果您不想删除
required:string
两次使用
class
instate
接口
for
Base
并扩展instate工具,请查看。

class Base {
    required: string;
}

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

在网上查一查

Thanks@Andr安德拉德,但在这里声明财产似乎没有用interfaceThanks@Andr安德拉德,但在这里声明财产似乎没有用interfacethanks@Suren但是在界面中声明属性似乎没有用为什么没有用?您可以在代码中使用类型检测。考虑到您有许多实现接口的类,因此您可以将值赋值为<代码>接口< /代码>类型,确保该对象至少具有interface@Suren.If你不介意你能给我举个更好的例子来证明这一点吗。Thanksthanks@Suren但是在界面中声明属性似乎没有用为什么没有用?您可以在代码中使用类型检测。考虑到您有许多实现接口的类,因此您可以将值赋值为<代码>接口< /代码>类型,确保该对象至少具有interface@Suren.If你不介意你能给我一个更好的例子来证明这一点。谢谢Hanks@Magu。但是在interfaceThanks@Magu中声明属性似乎没有用。但是在interfaceinterface中声明属性似乎没有用在javascript中什么都没有,如果从接口实现类,则需要提供所有必填字段。在javascript中,接口什么都不是,如果从接口实现类,则需要提供所有必填字段。