TypeScript是什么?

195 阅读5分钟

TypeScript定义

TypeScript is JavaScript with syntax for types

TypeScript 是具有类型语法的 JavaScript

从官方的定义来看,TypeScript本质上还是JavaScript,可以认为它是一门新的语言,也可以认为它是提供类型能力的工具集合,最终目的就是为了让JavaScript拥有类型能力。虽然我们开发时写的是TypeScript相关语法,但最后运行之前都会被编译成JavaScript,所以不用担心运行环境是否支持TypeScript。

TypeScript构成

为了让JavaScript拥有类型能力,TypeScript引入了一套完整的类型系统,包括基础类型、类型操作等。除此之外还引入了一些TC39即将发布的新语法。为了能让开发者使用类型以及新语法的同时,保证浏览器正常识别并运行我们的代码,TypeScript引入了TypeScript Compiler(tsc),通过tsc配置即可实现类型擦除跟语法降级。林不渡同学将这个定义成TS的工程能力,我还是蛮认同的。

类型相关的关键特性:

  1. 静态类型:允许开发人员显式声明变量的类型。这有助于在开发过程中捕获类型相关的错误,并提供更好的工具支持,如自动完成和代码导航。

  2. 类型推断:可以根据变量的初始值自动推断其类型。这减少了对显式类型注解的需求,使代码更简洁和可读。

  3. 接口:TS支持接口,用于定义对象的结构。接口可以用于强制对象具有所需的属性和方法,确保其符合特定的结构。

  4. 类和对象:TS提供了基于类的面向对象编程特性,包括类、继承和访问修饰符(如 public、private 和 protected)。它使开发人员能够编写更结构化和可维护的代码。

  5. 泛型:TS支持泛型,可以创建与不同类型一起使用的可重用组件。泛型提供类型安全性,并可以提高代码的灵活性和可维护性。

  6. 模块和命名空间:TS内置了对模块和命名空间的支持,允许开发人员将代码组织为单独的文件和逻辑单元。这有助于代码组织、重用性和封装性。

  7. 装饰器:TS支持装饰器,用于在设计时添加元数据并修改类、方法和属性的行为。装饰器常用于框架(如 Angular)中,用于实现依赖注入和组件配置等功能。

  8. 工具和 IDE 支持:TS设计时考虑了与现代开发工具和 IDE 的良好兼容性。与纯JS相比,它提供了更好的自动完成、代码导航和重构支持。

除了类型相关的特性外,TS还引入了的新语法

TC39每年都会针对ECMAScript标准发布一些新特性,发布一个新特性需要经历如下5个阶段:

  • 阶段 0: 初步提案(Strawperson)
  • 阶段 1: 提案(Proposal)
  • 阶段 2: 草案(Draft)
  • 阶段 3: 候选(Candidate)
  • 阶段 4: 完成(Finished)

TS 提前支持了一些已经到达阶段 3 / 4,或是比较重要的 TC39 提案,比如使用最多的可选链(?.)、空值合并(??)、装饰器等,这些语法都已经或即将成为 ECMAScript Next 的新成员。

TypeScript运行

Playground

TypeScript官方提供了一个在线的Playground,可以在不用搭建任何环境的情况下,直接运行TypeScript代码。特别是针对某项TS Config不清楚的时候,可以直接这里进行对比尝试。

image.png

ts-node

如果想要系统学习TypeScript,我们最好搭建一个能够快速运行TypeScript代码的环境,就像node index.js那样快速验证我们的代码逻辑。对应的工具就是这里介绍的ts-node,它们能直接运行ts文件,并支持监听文件重新运行。执行以下命令安装typescript以及ts-node:

# Locally in your project.
npm install -D typescript
npm install -D ts-node

# Or globally with TypeScript.
npm install -g typescript
npm install -g ts-node

然后,在项目中执行以下命令初始化TypeScript配置:

npx --package typescript tsc --init 
// 如果全局安装了 TypeScript,可以这么做 
tsc --init

接着,创建一个TS文件:

// index.ts
console.log("Hello World!")

最后执行以下命令:

ts-node index.ts

如果一切正常,终端会输出Hello World!。ts-node可以通过两种方式进行配置,直接在tsconfig.json中增加'ts-node'字段:

//tsconfig.json
{
  // This is an alias to @tsconfig/node16: https://github.com/tsconfig/bases
  "extends": "ts-node/node16/tsconfig.json",

  // 此处放置有关ts-node的配置
  "ts-node": {
    // It is faster to skip typechecking.
    // Remove if you want ts-node to do typechecking.
    "transpileOnly": true,

    "files": true,

    "compilerOptions": {
      // compilerOptions specified here will override those declared below,
      // but *only* in ts-node.  Useful if you want ts-node and tsc to use
      // different options with a single tsconfig.json.
    }
  },
  "compilerOptions": {
    // typescript options here
  }
}

或在执行ts-node命令时,添加命令行参数。这里介绍几种常用的配置:

  • ts-node -T(--transpileOnly) index.ts:跳过执行过程中的类型检查,加快文件执行速度,且不会被类型报错卡住。这一选项的实质是使用了 TypeScript Compiler API 中的 transpileModule 方法,我们会在后面的章节详细讲解。
  • ts-node --emit --compilerHost index.ts:不仅会执行当前文件,还会将编译后的Javascript代码输出到 .ts-node 文件夹下。

总结

  • TypeScript 是具有类型语法的 JavaScript
  • TypeScript构成:类型、语法、tsc(工程)
  • TypeScript运行:PlayGround、ts-node

参考: juejin.cn/book/708640…

www.typescripttutorial.net/typescript-…

medium.com/@Rushabh_/i…