【问题标题】:How to import a type (from another file) inside a `d.ts` file without turning it into a module?如何在`d.ts`文件中导入类型(从另一个文件)而不将其转换为模块?
【发布时间】:2020-12-28 02:41:30
【问题描述】:

刚刚遇到了关于 d.ts 文件和命名空间的奇怪情况。

我有一些 d.ts 文件,我在其中声明并合并了一个名为 PROJECTnamespace

请看下面它是如何声明和自动合并的(跨多个文件):

file1.d.ts ----- file2.d.ts ----- file3.d.ts

declare namespace PROJECT {

  interface SOME_INTERFACE {
    ...
  }

  type SOME_TYPE = SOME_UNION_TYPE

  // ETC
}

PROJECT 命名空间可以从我项目的每个文件中自动访问。示例:

SomeComponent.tsx

const someVariable: PROJECT.SOME_INTERFACE = { 
  // ... 
};

这是所有预期的行为。

当我决定声明另一个命名空间时,我的问题就开始了。

ADMIN_BLOGPOST.d.ts

import type { ACTION_THUNK_GENERIC } from "@hooks/useReducerThunk";

declare namespace ADMIN_BLOGPOST {
  // HERE I DECLARE MULTIPLE TYPES
  // AND ONE OF THE TYPES USES THE `ACTION_THUNK_GENERIC` TYPE, WHICH IS BEING IMPORTED HERE

  type ACTION_THUNK = ACTION_THUNK_GENERIC<ACTION,GET_STATE>
}

因为ACTION_THUNK_GENERIC 的顶级import type,现在我的命名空间不再自动可用。

VSCode 开始将 ADMIN_BLOGPOST.d.ts 视为一个模块,并开始让我在使用它之前必须 import 该命名空间,例如:

SomeComponent.tsx

import type { ADMIN_BLOGPOST } from "@src/types/ADMIN_BLOGPOST";

const someVariable: ADMIN_BLOGPOST.ACTION_THUNK

请注意,如果我从 ADMIN_BLOGPOST.d.ts 文件中删除该顶级导入(导入 ACTION_THUNK_GENERIC 的那个),那么我的 ADMIN_BLOGPOST 命名空间将变为可用,而无需先使用 import

但我真的需要那个导入。因为我需要ACTION_THUNK_GENERIC 类型,所以我可以构建非泛型ACTION_THUNK 类型。

有没有不同的方法可以让我的ADMIN_BLOGPOST 命名空间可用,而无需在使用前导入它?即:如何在 d.ts 文件中 import 而不将其转换为模块?

【问题讨论】:

    标签: typescript import namespaces typescript-typings


    【解决方案1】:

    使用declare global 在全局命名空间中工作,而与模块导入无关。例如:

    import type { ACTION_THUNK_GENERIC } from "@hooks/useReducerThunk";
    declare global {
      declare namespace ADMIN_BLOGPOST {
        type ACTION_THUNK = ACTION_THUNK_GENERIC<ACTION,GET_STATE>
      }
    }
    

    您也可以使用动态导入:

    declare namespace ADMIN_BLOGPOST {
      type ACTION_THUNK = import("@hooks/useReducerThunk").ACTION_THUNK_GENERIC<ACTION,GET_STATE>
    }
    

    【讨论】:

    • 谢谢!不知道。但是刚刚发现了另一种解决方案,您可以将其添加到答案中以使其更加完整。 “动态”导入语法如:type ACTION_THUNK = import("@hooks/useReducerThunk").ACTION_THUNK_GENERIC&lt;ACTION,GET_STATE&gt;。这是使用 declare global 的替代方法。
    • 谢谢。添加了?
    • ASYNC_THUNK_GENERIC 应该是 ACTION_THUNK_GENERIC 吗?
    • @EdStaub 是的!我已经修复了id。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-07-12
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多