为什么在TypeScript中实现接口时需要重新定义属性?

问题描述 投票:2回答:3

我正在学习类和接口。我有一个让我烦恼的事情,这是我第一次处理这类事情,所以请在这里忍受。

假设我有此界面:

// IFoo.d.ts
export default interface IFoo {
  foo: string;
  bar: number;
}

当我在一个类中实现它时,我将执行以下操作:

// FooModel.ts
import IFoo from './IFoo';

export default class FooModel implements IFoo {
  foo: string;
  bar: number;

  constructor({ foo, bar }: IFoo = { foo: 'hello', bar: 1 }) {
    this.foo = foo;
  }
}

为什么我必须重新实现相同的属性?

这基本上与复制粘贴相同,但有严格的约定。另外,我必须分别键入foobar 6次,才能根据接口正确地为其分配默认的可选

值。

也有一种更有效的方法吗?

编辑;我正在尝试实现以下目标:

具有属性的类,可以从中使用属性进行打字稿的检查,如下所示:界面

export default interface FooDTO {
  foo: string;
  bar: number;
}

模型

export interface IFoo {
  foo: string;
  bar: number;
}

export default class FooModel implements IFoo {
  foo: string;
  bar: number;

  constructor({ foo, bar }: IFoo = { foo: 'hello', bar: 1 }) {
    this.foo = foo;
  }
}

控制器

export default class FooController {
   public static async readAll(): Array<FooDTO> {
      // some model stuff which maps query to dto
      return Array<FooDTO>result;
   }
}

我正在学习类和接口。而且我有一个让我烦恼的事情,这是我第一次处理这类事情,所以请在这里忍受。假设我得到了这个接口:// ...

typescript class implements
3个回答
1
投票

您可以使用abstract class代替接口。与接口具有相同的好处,但是可以扩展它:


0
投票

如果定义仅具有属性的接口,则基本上定义了一种数据结构类型,然后可以使用该数据结构类型来键入对象。


0
投票

我认为“为什么我必须再次重新实现相同的属性”的规范答案在(越来越过时的TypeScript spec中:]]

请注意,因为TypeScript具有结构化类型系统,所以一个类无需明确声明其实现了一个接口—该类仅包含适当的实例成员集就足够了。类的implements子句提供一种机制来断言和验证该类包含适当的实例成员集,但是,它对类类型没有影响

© www.soinside.com 2019 - 2024. All rights reserved.