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.
的地方
你能做什么
- 将包含接口的文件重命名为
.ts
。
- 将全局类型放入模块中(包含
import
/export
的文件)
- 确保导入此模块,以便 Deno CLI 在编译时可以找到它
请注意,deno
使用自己的集成 TS 编译器,不同于您的 IDE(VS Code 和其他编译器)。因此 IDE 没有显示类型错误并不意味着 deno run
或 deno 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
}
}
我是 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.
你能做什么
- 将包含接口的文件重命名为
.ts
。 - 将全局类型放入模块中(包含
import
/export
的文件) - 确保导入此模块,以便 Deno CLI 在编译时可以找到它
请注意,deno
使用自己的集成 TS 编译器,不同于您的 IDE(VS Code 和其他编译器)。因此 IDE 没有显示类型错误并不意味着 deno run
或 deno 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
}
}