TypeScript类与具有相同名称的接口之间的关系

Nat*_*ley 22 interface class typescript

我在查找TypeScript类和具有相同名称的接口之间看似特殊关系的任何明确文档或解释时遇到了一些麻烦.

  • 具有与类同名的接口有什么意义?
  • 为什么与接口共享其名称的类会自动实现该接口?
  • 当类和接口具有相同名称时,为什么编译器会抱怨我的getterly接口字段的getter实现,但如果名称不同,则接受实现?
  • 是否有任何规范性文件解决这些问题?

码:

// Co-named interface and class doesn't like readonly property implementation:

interface Foo {
  readonly x: number; // Error: Duplicate identifier 'x'
  y: number;
}

class Foo {
  get x(): number { // Error: Duplicate identifier 'x'
    return 0;
  }

  y = 1;
}

// Same as above, but different class name + explicit `implements`

class Bar implements Foo {
  get x(): number { // No error!
    return 0;
  }

  y = 1;
}

// Duplicating the first example, but explicitly implementing the co-named interface:

interface Baz {
  readonly x: number; // Error: Duplicate identifier 'x'
  y: number;
}

class Baz implements Baz {
  get x(): number { // Error: Duplicate identifier 'x'
    return 0;
  }

  y = 1;
}
Run Code Online (Sandbox Code Playgroud)

y2b*_*2bd 24

将合并模块中相同名称的接口:

interface Foo {
    x: number;
}

interface Foo {
    y: string;
}

let g = {} as Foo;
g.x; // OK
g.y; // OK
Run Code Online (Sandbox Code Playgroud)

类声明同时创建构造函数和类型声明,这实际上意味着所有类都可以用作接口.

class Bar {
    y: number;
}

interface IBaz extends Bar { } // includes y: number

class CBaz implements Bar {
    y: number = 5;
}
Run Code Online (Sandbox Code Playgroud)

因此,具有相同名称的类和接口相当于具有两个具有相同名称的接口,并且如果接口的两个实例重新声明具有不同类型的相同成员,则会发生合并冲突.

奇怪的是,Typescript将允许这样:

export interface Foo {
    readonly x: number;
}

export class Foo {
    readonly x: number = 3;
}
Run Code Online (Sandbox Code Playgroud)

但它不会允许,get x() { return 3; }即使这两个生成为readonly x: number,所以我只能想象类型检查器在合并期间认为它们是不同的,即使它们在语义上是相同的(这就是为什么你可以扩展接口并指定readonly属性)作为一个吸气功能).