export 从 typeScript 中的 class 移除接口实现

export removes interface implementation from class in typeScript

我有 .ts 文件,其中包含 class 声明 .d.ts 文件 接口声明.

.ts 文件示例:

class A {
  constructor() {
    this.name = "Jo";
  }
}

.d.ts 文件示例:

interface A {
  name: string
}

所以,问题是 - 一切正常,class 自动检测接口 A 并实现它

但是,当我添加 class named exportdefault export 时,如下例所示 - 接口实现消失,又清楚了 class A.

export default class A {
  constructor() {
    this.name = "Jo";
  }
}

class A {
  constructor() {
    this.name = "Jo";
  }
}
export { A }

两种变体都会导致相同的问题 - “属性 'name' 在类型 'A' 上不存在”。

如果将接口添加到同一个文件它会工作,但我需要这个接口供全局使用并且不想直接在 class 或同一个文件中编写相同的实现。

那么,这是怎么回事,我应该怎么做才能把事情做好?

.d.ts 文件中编写接口并将属性与 same-named class.

冲突是最不寻常的

惯用的做法是将接口写在一个文件中:

export interface Nameable{
    name: string
}

并将其导入另一个并通过 implements 关键字正确使用它:

import {Nameable} from './Nameable';

export class A implements Nameable{
    // etc
}

当然,您可以将完全相同的界面导入任何其他文件。让事情全球化很少能带来最好的结果。

当我把你的代码放在 typescript playground 上时,我得到这个错误:

class A Merged declaration 'A' cannot include a default export declaration. Consider adding a separate 'export default A' declaration instead.(2652)

如果您遵循该建议:

interface A {
  name: string
}

class A {
  constructor() {
    this.name = "Jo";
  }
}

export default A

如你所愿Playground


但是,如果 class A 所在的文件是 Typescript,那么您根本不需要 .d.ts 文件,您 class 应该只是:

class A {
  name: string
  constructor() {
    this.name = "Jo";
  }
}

它自己隐含的接口是什么:

const a: A = { name: 'Foo' } // fine

Playground