Skip to content

Commit cc1eff7

Browse files
committed
JSDoc @import 标签
5.5
1 parent f2acec6 commit cc1eff7

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

zh/release-notes/typescript-5.5.md

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,101 @@ function f1(obj: Record<string, unknown>, key: string) {
177177

178178
如上,`obj``key` 都没有修改过,因此 TypeScript 能够在 `typeof` 检查后将 `obj[key]` 细化为 `string`
179179
更多详情请参考[PR](https://github.com/microsoft/TypeScript/pull/57847)
180+
181+
## JSDoc `@import` 标签
182+
183+
如今,在 JavaScript 文件中,如果你只想为类型检查导入某些内容,这显得很繁琐。
184+
JavaScript 开发者不能简单地导入一个名为 `SomeType` 的类型,如果在运行时该类型不存在的话。
185+
186+
```ts
187+
// ./some-module.d.ts
188+
export interface SomeType {
189+
// ...
190+
}
191+
192+
// ./index.js
193+
import { SomeType } from "./some-module"; // runtime error!
194+
195+
/**
196+
* @param {SomeType} myValue
197+
*/
198+
function doSomething(myValue) {
199+
// ...
200+
}
201+
```
202+
203+
`SomeType` 类型在运行时不存在,因此导入会失败。
204+
开发者可以使用命名空间导入来替代。
205+
206+
```ts
207+
import * as someModule from "./some-module";
208+
209+
/**
210+
* @param {someModule.SomeType} myValue
211+
*/
212+
function doSomething(myValue) {
213+
// ...
214+
}
215+
```
216+
217+
`./some-module` 仍是在运行时导入 - 可能不是期望的行为。
218+
219+
为避免此问题,开发者通常需要在 JSDoc 里使用 `import(...)`
220+
221+
```ts
222+
/**
223+
* @param {import("./some-module").SomeType} myValue
224+
*/
225+
function doSomething(myValue) {
226+
// ...
227+
}
228+
```
229+
230+
如果你想在多处重用该类型,你可以使用 `typedef` 来减少重覆。
231+
232+
```ts
233+
/**
234+
* @typedef {import("./some-module").SomeType} SomeType
235+
*/
236+
237+
/**
238+
* @param {SomeType} myValue
239+
*/
240+
function doSomething(myValue) {
241+
// ...
242+
}
243+
```
244+
245+
对于本地使用 `SomeType` 的情况是没问题的,但是出现了很多重覆的导入并显得啰嗦。
246+
247+
因此,TypeScript 现在支持了新的 `@import` 注释标签,它与 ECMAScript 导入语句有相同的语法。
248+
249+
```ts
250+
/** @import { SomeType } from "some-module" */
251+
252+
/**
253+
* @param {SomeType} myValue
254+
*/
255+
function doSomething(myValue) {
256+
// ...
257+
}
258+
```
259+
260+
此处,我们使用了命名导入。
261+
我们也可将其写为命名空间导入。
262+
263+
```ts
264+
/** @import * as someModule from "some-module" */
265+
266+
/**
267+
* @param {someModule.SomeType} myValue
268+
*/
269+
function doSomething(myValue) {
270+
// ...
271+
}
272+
```
273+
274+
因为它们是 JSDoc 注释,它们完全不影响运行时行为。
275+
276+
更多详情请参考[PR](https://github.com/microsoft/TypeScript/pull/57207)
277+
感谢 [Oleksandr Tarasiuk](https://github.com/a-tarasyuk) 的贡献。

0 commit comments

Comments
 (0)