Javascript 如何编写和使用不带';在@types或DefinitelyTyped上不存在吗?

Javascript 如何编写和使用不带';在@types或DefinitelyTyped上不存在吗?,javascript,typescript,npm,definitelytyped,Javascript,Typescript,Npm,Definitelytyped,我正在使用一个名为foo的npm包,它在DefinitelyTyped上不存在。换句话说,@types/foo不存在(或者可能已经过时!) 我希望仍然能够在更严格的设置下使用它,例如noImplicitAny,因此我需要自己编写自定义定义文件。最后,我想向DefinitelyTyped发送一个pull请求,以便该文件对我项目之外的其他人有用 有一些简单的解决方案,比如创建一个名为/src/types.d.ts的全局文件,我可以在其中编写以下代码 declare module "foo" {

我正在使用一个名为
foo
的npm包,它在DefinitelyTyped上不存在。换句话说,
@types/foo
不存在(或者可能已经过时!)

我希望仍然能够在更严格的设置下使用它,例如
noImplicitAny
,因此我需要自己编写自定义定义文件。最后,我想向DefinitelyTyped发送一个pull请求,以便该文件对我项目之外的其他人有用

有一些简单的解决方案,比如创建一个名为
/src/types.d.ts的全局文件,我可以在其中编写以下代码

declare module "foo" {
    export function hello(): void;
    export function world(): void;
}
但是如果我使用这种语法,当我将模块提交给DefinitelyTyped时,我可能需要重写模块


我如何组织我的项目,以便我可以轻松地编写本地.d.ts文件,然后将其发送到DefinitelyTyped?

我将一步一步地进行解释,这样做可能看起来很冗长,但是按照给出的说明应该只需要几分钟。事实上,这里有一个简短的版本,您可以在bash或PowerShell中运行

mkdir-p./localtypes/foo
cd/本地类型/foo
npm init--范围类型--是
echo“导出函数hello():void;导出函数world():void”>。/index.d.ts
cd../。。
npm安装/本地类型/foo
背景 让我们设想以下项目结构:

proj/
├─ tsconfig.json
└─ src/
   └─ ...
在项目的根目录下创建本地类型文件夹。 不管它叫什么,但我们称它为
本地类型
。一旦你掌握了我们在这里所做的事情,你可以把它改成你想要的任何东西

proj/
├─ tsconfig.json
├─ local-types/
└─ src/
   └─ ...
在本例之外的大多数情况下,我可能只将其命名为
类型

在本地类型目录中创建新包 由于您试图导入名为
foo
的模块,我们将创建一个名为
foo
的文件夹,其中包含
索引.d.ts

//本地类型/foo/index.d.ts
导出函数hello():void;
导出函数world():void;
我们还希望通过创建一个package.json使其成为一个npm包:

cd本地类型/foo
npm init--范围类型--是
此时,您的项目应如下所示:

proj/
├─ tsconfig.json
├─ local-types/
|  └─ foo/
|     └─ index.d.ts
|     └─ package.json
└─ src/
   └─ ...
您现在应该可以从
src
中的任何文件导入
foo

从“foo”导入{hello,world};
你好;
世界();
请记住,您可能没有一个带有
index.d.ts
的单一入口点包。在这种情况下,您将希望模仿在npm上发布的包结构

将包添加为依赖项(或潜在的依赖项) 如果您正在编写库,您可能希望在依赖项中使用该库,但应用程序可能希望使用devdependency。只需添加
文件:./local types/foo
作为
@types/foo
的版本:

“依赖项”:{
@types/foo:“文件:本地类型/foo”
}
发布到DefinitelyTyped 您的
.d.ts
文件是否完整且有用?考虑编写一些测试并发送一个拉式请求来定义类型,以便其他人可以从你所做的工作中受益。p> 如果您能够在运行时导入这些包而没有问题,那么您已经拥有了适当的包结构

要记住的事情
  • 不要在这些本地类型包中使用
    声明模块“…”
    语法。
    • …除非你想写一个模块扩充。但你可能不是
  • 确保您的文件至少有一个
    导入
    导出
    ,除非它们是真正的脚本/全局文件

感谢您的详细解释!我认为详细版本中缺少命令“npm install./local types/foo”