@@ -177,3 +177,101 @@ function f1(obj: Record<string, unknown>, key: string) {
177
177
178
178
如上,` obj ` 和 ` key ` 都没有修改过,因此 TypeScript 能够在 ` typeof ` 检查后将 ` obj[key] ` 细化为 ` string ` 。
179
179
更多详情请参考[ 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