像 jest 一样创建一个全局函数

Create a global function like jest does

我正在开发一个将使用 React 的元框架。

我想提供一些无需导入即可直接使用的函数,就像 jest 对函数 it()beforeAll() 等所做的一样...

我基本上通过简单地声明类型化变量就成功了:

//myfile.d.ts
declare var someFunction : () =>  string

然后为其分配一个函数:

//someFile.ts
someFunction = () => "This is working"

然后,在项目的根目录下,我只导入了一次 someFile.ts 以确保定义了 someFunction :

import "./someFile"

是的,我们很好,该函数是全局的,不需要导入,并且输入正确!

那么,问题是什么?

好吧,当我自己声明我的类型时,这项工作就完成了。 但是如果我需要使用库的类型来创建我自己的类型,它就不再起作用了

假设我想让 axios 对象全局可用而无需导入。

这是我在声明文件中所做的

import { Axios } from "axios"
interface MyOwnAxiosType extends Axios {}

declare var myOwnAxios:MyOwnAxiosType

但是一旦在顶部添加导入,myOwnAxios 就再也找不到此文件之外的

如果您知道我可能做错了什么,将不胜感激,谢谢!

在您的文件中使用 import 会使您的声明文件成为一个模块,而不是环境声明上下文。

相反,您将不得不使用这种令人困惑的语法:

import Axios = import("axios").Axios;

interface MyOwnAxiosType extends Axios {}

declare var myOwnAxios:MyOwnAxiosType
  • import("axios") 导入模块 axios 作为命名空间(仅限类型)

  • import("axios").Axios 从命名空间

    获取类型 Axios
  • import Axios = import("axios").Axios 给上面的类型起个别名

使用这种导入将解决问题,因为您不再使用静态导入。


如果这不起作用,您可以尝试内联它:

interface MyOwnAxiosType extends import("axios").Axios {}

declare var myOwnAxios:MyOwnAxiosType

解决方法如下: 在 ts 文件中

import * as axios_ from "axios"

declare global {
    var myOwnAxioss : typeof axios_.default
}
global.myOwnAxioss = axios_ as any

就是这样,您现在可以在没有任何导入的情况下使用输入来完成此操作。

myOwnAxioss.get()