Typescript 接口范围是如何工作的?如何使接口全局化?

How do Typescript interface scope is working ? How to make interfaces global?

我是 Typescript 和 Deno 的新用户,我不太了解接口范围是如何工作的。

我有一个树层应用:

第一层(App.ts)是我的应用,这是我应用的核心逻辑部分。这部分可以是任何需要引用第二层的文件(API.ts)。

第二层(API.ts)是我可以与任何远距离通信的入口点API(比如Facebook、stripe、Google API)

第三层是一堆.ts文件。第二层(API.ts)可以与它们中的每一个进行通信。每个文件处理特定 API 的非常精确的部分。例如,我有一个 FB_page.ts 来处理 Facebook API 负责页面的部分,另一个文件 STRP_Subscription 处理 Stripe 的一部分 API 负责订阅等

我的问题是

我有很多接口来处理每种类型的参数、每个错误和每个 API 调用可以输入或输出的响应。我的应用程序的每一层都需要这些接口。

如果我可以将特定 API 部分的接口放入负责它的文件中,那就太棒了。例如,如果我需要 Facebook 页面 API 的多个接口,我想将其放入 FB_page.ts 文件中。

但是如果我在我的应用程序的第一层需要它们,那么必须导入 FB_page.ts 文件是很乏味的 App.ts 像这样: import {IPost, IPost_Error, IPost_Response} from '../lib/FB_page.ts';

所以我将它们放在 .d.ts 文件中,但它们似乎也不是全局的?

如何才能访问我的接口,而不必在我的应用程序中的任何地方导入它们?

感谢您的帮助。

尝试导出命名空间

export as namespace ICalendar;
import { Document } from "mongoose";

export interface Calendar extends Document {
userId?: Object
}

Deno 中几乎所有东西都是模块。如果您提供具有全局类型的 non-module/script,将找不到它。此外,Deno 无法处理 .d.ts 文件扩展名,除了一些带有 compiler hints.

的地方

你能做什么

  1. 将包含接口的文件重命名为 .ts
  2. 将全局类型放入模块中(包含 import/export 的文件)
  3. 确保导入此模块,以便 Deno CLI 在编译时可以找到它

请注意,deno 使用自己的集成 TS 编译器,不同于您的 IDE(VS Code 和其他编译器)。因此 IDE 没有显示类型错误并不意味着 deno rundeno cache 可以编译源代码。

示例代码

// Put following code inside one of your used modules
declare global {
  interface IPost {
    foo: string;
  }
}

// IPost will be available globally without import
const post: IPost = { foo: "bar" }

如果您想将全局类型与其他代码分开,可以使用副作用导入:

import "./lib/global.ts";
const post: IPost = { foo: "bar" };
global.ts:
export {}; // use some export to mark file as module
declare global {
  interface IPost {
    foo: string
  }
}