如何在 `d.ts` 文件中导入类型(从另一个文件)而不将其转换为模块?
How to import a type (from another file) inside a `d.ts` file without turning it into a module?
只是 运行 遇到了一个关于 d.ts
文件和命名空间的奇怪情况。
我有一些 d.ts
文件,我在其中声明并合并了一个名为 PROJECT
.
的 namespace
查看下面它是如何声明和自动合并的(跨多个文件):
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
而不将其转换为模块?
使用 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>
}
只是 运行 遇到了一个关于 d.ts
文件和命名空间的奇怪情况。
我有一些 d.ts
文件,我在其中声明并合并了一个名为 PROJECT
.
namespace
查看下面它是如何声明和自动合并的(跨多个文件):
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
而不将其转换为模块?
使用 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>
}