当导入带有typescript
代码的包时,消费者会使用打字稿还是转译代码(例如打字稿到ES5(。
场景 #1:如果使用者使用转译的代码(不在打字稿中(。VSCode 如何从包类型中推荐自动完成?
场景 #2:如果包与打字稿文件一起提供。
- 如果使用者不使用打字稿会发生什么?
- 消费者端的捆绑是如何发生的?
TL;博士
场景 #1:这是公共 NPM 包最常见的场景,编辑器使用包含类型声明的外部.d.ts
文件 场景#2:我只在内部库中看到过这个
- 1(你需要自己编译TS,但这可能不是必需的,因为几乎总是有一个编译到js版本的库,也是
- 2(这可能有很多种方式,最好的情况是该库为您提供了一个预先优化的JS,该JS仅与您的代码捆绑在一起,最坏的情况是您必须确保安装了所有正确的依赖项,以便库能够与您的代码一起编译,并且它们需要与您自己使用的依赖项兼容。在我看来,这不值得麻烦,为 NPM 包提供类型声明足以满足 TypeScript 可以提供的类型安全级别。
长版本
人们通过NPM分发基于TypeScript的代码有几十种变体。我知道的大多数大型库都发布它们的编译(通常是缩小的(JS,并添加.d.ts
声明文件以供编辑器支持 - 这些可能是手写的,也可以使用代码库中的tsc
生成。VSCode也将其TypeScript语言服务器用于JavaScript文件,因此在许多情况下,它甚至不需要额外的声明文件来为您提供基本的自动完成功能。库可以在package.json
内声明一个types
字段,VSCode和其他编辑器会在那里找到类型。有一个相当大的社区,它为大多数库维护大多数非官方的类型声明 - 对于晦涩难懂的库,你可能不走运。
几个例子
材质用户界面
- 是用JavaScript编写 的
- 具有手写的 TypeScript 声明(可能准确,也可能不准确(
反应
- 是用JavaScript编写 的
- NPM 包不提供 TypeScript 声明,但 VSCode 知道在哪里可以找到非正式的外部声明
角
- 用打字稿编写
- 使用已弃用的
typings
字段指向其类型声明
jQuery
- 是用JavaScript编写 的
- 同样,没有提供类型声明,但您的编辑器可能知道如何获取非正式声明
塞涅卡
- 是用JavaScript编写 的
- 在撰写本文时具有两年前的非正式类型声明 - 祝您好运,了解 API 是否真的没有更改
重要要点:
- 在JS生态系统中,人们做事的方式并不单一,并且扩展为TS生态系统。
- 您使用的大多数类型声明都不是官方的,而是由社区维护的,主要是在 Definite typed
- 这些类型可能对您撒谎(可能已过时,只是完全错误或用于较旧的 TS 版本(
- TypeScript 是 JavaScript 的超集,根据定义,它带有所有相同的陷阱 。
- 所有类型在运行时都会被删除,最终你运行的是普通的JavaScript ,所有这些都需要