文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

TypeScript中import type与import的区别详析

2024-04-02 19:55

关注

背景

这周遇到了一个比较奇怪的问题:如何在 TypeScript 中根据某个 enum 的取值来执行后续逻辑?

按理来说应该很简单,这是 enum 的定义:

export enum MyEnum {
  DEFAULT = 0,
  SOME_VALUE = 1,
  SOME_OTHER_VALUE = 2,
}

然后在另一个项目中,通过 import type 来引入:

import type { MyEnum } from 'somepackage';

const someFunction = (myEnum: MyEnum) => {
  if (myEnum === MyEnum.SOME_VALUE) {
  	// some logic here
    return
  }
  if (myEnum === MyEnum.SOME_OTHER_VALUE) {
    // some logic here
    return
  }
  // some logic here
  return
}

但是这个时候 VS Code 居然提示了一个错误:

'MyEnum' cannot be used as a value because it was imported using 'import type'.ts(1361)

我的第一反应是,难道在 TypeScript 里不能检查 enum 的取值?这也太说不过去了吧…

后来折腾了半天,发现按照提示,把 import type 换成 import 就好了。

import type vs import

之前没有深入学习过 TypeScript,就是看项目里别人怎么用,就照猫画虎地写。

这次也是一样,别人都是 import type,我就直接在其中加了一个我想引入的 MyEnum,结果就不行了,还得把 MyEnum 分开来用 import。

但这是为什么呢?后来搜了一下,终于弄明白了。TypeScript 3.8 文档上说:

import type only imports declarations to be used for type annotations and declarations. It always gets fully erased, so there’s no remnant of it at runtime.

大概意思就是:import type 是用来协助进行类型检查和声明的,在运行时是完全不存在的。

这下终于明白上面 enum 的那个问题了:如果通过 import type 来引入 MyEnum,固然可以在构建时起到类型检查的作用,但在运行时 MyEnum 就不存在了,当然就无法检查 MyEnum.SOME_VALUE 之类的取值了!

可是仔细一想,TypeScript 本来就不应该在运行时存在呀!为什么还要用 import type 呢?

其实,在少部分情况下(刚好就包括 enum ),import 的内容在运行时的确是存在的,使用 import type 和import 就会有区别。

使用 import type 的好处

import type 是 TypeScript 3.8 才加入的,为什么要加入这个功能呢?使用 import type 而不是 import 有什么好处?

简单来说,大部分情况下用 import 完全就可以了,但在比较罕见的情况下,会遇到一些问题,这时候使用 import type 就可以解决问题了。

当然,我也没碰到过这样的问题,只不过项目里在所有引入 TypeScript 类型的地方用的基本都是 import type,也就跟着用了。这样当然是更保险一些,没啥坏处。

参考链接

Do I need to use the “import type” feature of TypeScript 3.8 if all of my imports are from my own file?

Runtime typesafety in typescript

总结

到此这篇关于TypeScript中import type与import区别的文章就介绍到这了,更多相关TS import type与import区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯