TypeScript - 声明与导出 - 最佳实践?

TypeScript - Declare vs Export - Best Practices?

简短而贴心,用 declare 或 export 定义我自己的接口是更好的做法吗?

// i.something.d.ts
export default interface ISomething {
    myValue: string;
} 

// something.ts
import ISomething from 'i.something';

export class Something implements ISomething {...}

对比

// i.something.d.ts
declare interface ISomething {
    myValue: string;
} 

// something.ts
export class Something implements ISomething {...}

当然,如果它必须导入自己的另一种类型,即使 declare 也无法在环境中工作。 (除非有更好的方法)

// i.something-else.d.ts
import SomeBiggerThing from '...';
import SomeKindOfType from '...';

declare interface ISomethingElse extends SomeBiggerThing {
    myValue: SomeKindOfType;
} 

// something-else.ts
// ISomethingElse isn't available unless I import it, because it imports its own stuff.
import ISomethingElse from 'i.something-else';

export class Something implements ISomethingElse {...}

大多数 large/mature TypeScript 库避免依赖环境声明,而是 export 任何需要在当前文件之外重用的东西。例如,Angular 代码库为每个模块都有一个 interfaces.ts 文件,该文件被导入到需要引用接口的每个文件中:

https://github.com/angular/angular/tree/0b1f5d21270063b2019b11a9494397916d3977d6/packages/http/src/interfaces.ts

这有几个优点:

  • 文件中使用的所有类型都通过文件顶部的 import 语句明确引用。
  • 可以更轻松地导出模块的接口以供模块的使用者使用。为了导出环境接口,您需要直接在模块的主文件中定义接口(只能从模块中导出本地声明)。
  • 更 JavaScript-y。现代 JavaScript 依赖于 importexport 语句,而环境类型上下文是一个仅限 TypeScript 的概念。