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 export 或 default 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
我有 .ts 文件,其中包含 class 声明 和 .d.ts 文件 接口声明.
.ts 文件示例:
class A {
constructor() {
this.name = "Jo";
}
}
.d.ts 文件示例:
interface A {
name: string
}
所以,问题是 - 一切正常,class 自动检测接口 A 并实现它。
但是,当我添加 class named export 或 default 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