• 主页
  • 归档
  • 分类
  • 照片墙
所有文章 友情链接 关于我

  • 主页
  • 归档
  • 分类
  • 照片墙
  1. 1. 开发环境
    1. 1.1. 使用编译器
  2. 2. 语法与特性
    1. 2.1. 变量类型
      1. 2.1.1. 数组
      2. 2.1.2. 枚举
      3. 2.1.3. 任意值
      4. 2.1.4. 空值
      5. 2.1.5. never
    2. 2.2. 类型推断机制
    3. 2.3. 自定义类型
      1. 2.3.1. 访问控制
      2. 2.3.2. 构造器
  3. 3. 写在最后

TypeScript初见

2019-06-23 15:22:13
总字数 1.6k
预计阅读时间 6 分钟

TypeScript ( 以下简称TS ) 由微软开发, 是一个JavaScript的超集, 遵循ES6规范
也就是TS本身支持所有的JS语法, 已有的JS程序不需要任何改动就可以在TS环境下运行
同时进行了扩展
添加了基于类的面向对象编程特性, 以及数据类型

这种数据类型的定义, 与Java这种编译型语言终究不同
我的体会是它只存在编译期的类型检查, 而运行期还是与JS基本相同
这样的好处也很明显, 能够减少在开发阶段犯错误的几率 ( 毕竟IDE可以完成类型检查的错误提示 )
避免一些类型问题都需要调试来排查

开发环境

首先这种JavaScript的超集, 如果需要在浏览器运行
必然是需要compiler的, 因为需要转成可执行的JavaScript代码

如果是在nodejs里面运行, 就可以不需要了, 因为它可以想babel那样, 封装一个自己的运行器出来
比如babel的 babel-node, 就如同是nodejs的 node, 前者提供了提供一个支持ES6的REPL环境

1
npm install -g typescript

当然如果是只在项目里面使用, 也可以不执行全局安装

typescript安装
可以看到安装后添加了两个命令行工具, 分别是tsc和tsserver
tsc就是 TypeScript Compiler

使用编译器

现在可以尝试写个typescript文件
比如

1
2
3
4
5
6
// hello.ts
export class Hello {
hello(msg) {
console.log(msg)
}
}

然后执行tsc hello.ts
就会生成hello.js文件, 内容如下

1
2
3
4
5
6
7
8
9
10
11
"use strict";
exports.__esModule = true;
var Hello = /** @class */ (function () {
function Hello() {
}
Hello.prototype.hello = function (msg) {
console.log(msg);
};
return Hello;
}());
exports.Hello = Hello;

就是一个语法的转换过程

语法与特性

ES6提供的语法糖就不提了, 基本每天都在写
就记录一下TS自己的一套类型体系吧

变量类型

TS自带一套类型体系, 有一些与JavaScript当中有重叠 (当然JS当中也不能完全称之为类型, 因为都是对象)
string对应 JS的 String
number对应 JS的 Number
object对应 JS的 Object
boolean对应 JS的 Boolean
symbol对应 JS的 Symbol

所以定义变量时

1
2
3
var str1: string = 'ab'
// 或者
var str2: String = 'cd'

都可以, 从eslint的默认设置来看, 官方推荐前者

变量类型定义同样可以应用于函数的形参, 语法相同

数组

数组类型有两种表示方法

1
2
var arr1: string[] = ['ab','cd']
var arr2: Array<string> = ['ab','cd']

后一种明显很像Java的泛型写法, 但是eslint默认的语法检查规则推荐前者

枚举
1
2
3
4
5
enum Color1 {Red, Green, Blue}
let c1: Color1 = Color1.Green

enum Color2 {Black = 10, White = 20}
let c2: Color2 = Color2.Black

使用枚举类型可以为一组数值赋予友好的名字
默认从0开始编号, 也可以手动指定编号

任意值

我们并不是每次都能知道变量的类型是什么, 或者是引入的一些第三方库, 本身就是JS写的
没有类型声明
那么可以用any来直接忽略编译阶段的检查

类型检查是TS的最大优势, 主要是帮助开发者排除错误的
any只是一种兼容的做法, 不应该滥用, 否则和写JS还有什么区别

空值

对于定义变量不算很常用, 有几种表示方法

1
2
3
4
5
6
7
8
9
10
11
12
// void类型包含 undefined和null
let n1: void = undefined
let n2: void = null

// undefined和null也是类型
let n3: undefined = undefined
let n4: null = null

// 可以用void表示一个函数无返回值(当然JS当中无返回值就是返回undefined, 这点也正好符合)
function test(): void {
console.log('test')
}
never

never可以用来表示函数的返回值, 表示用不存在的类型
该函数必须存在无法到达的终点 ( 比如抛出异常或者死循环 )

1
2
3
4
5
6
function test1(): never {
throw new Error()
}
function test2(): never {
while(true) {}
}

类型推断机制

如果声明变量时没有指定类型, 那么编译器就会根据初始化的赋值来推断这个变量的类型
对于函数返回值同样适用
比如

1
2
let str = 'abc'
str = 10 // Error

初始化的赋值编译器推断str是string类型, 所以之后给他赋值number类型就会报错

自定义类型

TS当中可以使用interface和class来自定义类型
与其他强类型语言当中的接口与类的定义类似, 前者可以写属性和方法声明, 后者可以实现接口
class定义的类型可以直接用new关键字来创建对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
interface Demo {
name: string
value?: object
test(msg: string): void
}
let demo = {
name: 'sookie',
test: function(msg: string): void{
console.log(msg)
}
}
// ? 代表该属性是可选的, 也可以应用于函数的形参
// 上述方式可以理解为给该接口创建一个实现类(类比Java当中的匿名类)
// 或者也可以用下面的方式实现一个接口
class DemoImpl implements Demo{
name: 'sookie'
test(msg: string): void{
console.log(msg)
}
}
let demo2: Demo = new DemoImpl()
demo2.test('Hello')

需要注意的是, 继承接口需要定义函数的实现, 以及属性的值, 带有?的可选属性可以不指定

访问控制

TS有3种访问控制关键字, 分别是public, private, protected
具体作用和Java一样, 缺省就是public

构造器

可以对一个类编写一个构造器, 在对象被创建时调用

1
2
3
4
5
6
7
class Demo {
constructor(private name: string) { }
show(): void {
console.log(this.name)
}
}
new Demo('sookie').show()

构造器参数上添加任意一种访问控制关键字, 都可以直接把该参数设置为对象的属性
相当于构造器里面写this.name = name, 添加之后就可以省略这个赋值

写在最后

最近拿 Nestjs 给自己的博客写了个管理端的后台
当然前后端分离是必须的, Nestjs写后台也只写接口
这个框架需要用TypeScript编写代码, 于是就顺带学了学

据说习惯了TypeScript就再也不想写JavaScript了, 我倒是没怎么觉得
只是Nestjs的很多设计都和Spring有几分神似, 只能说Spring大法好, 上手倒是容易很多

  • TypeScript
  • 前端杂烩

扫一扫,分享到微信

优雅写异步与循环
照片墙施工记录 
© 2024 夏夜梦星辰
鲁ICP备19028444号
Power By Hexo
  • 所有文章
  • 友情链接
  • 关于我
{{searchItem.query}}
标签: 分类:
  • maven
  • 持续集成
  • JMS
  • 线程
  • JavaScript
  • ECMAScript6
  • 单元测试
  • Promise
  • Web Worker
  • 函数
  • prototype
  • 模块化
  • 正则表达式
  • 数据库
  • MongoDB
  • 索引
  • 集群
  • 全文检索
  • flutter
  • dart
  • git
  • 版本控制
  • linux
  • shell
  • docker
  • nginx
  • jenkins
  • opencv
  • vim
  • react
  • react native
  • 前端
  • css
  • HTML5
  • Hexo
  • sass
  • Three.js
  • TypeScript
  • Vue
  • 组件化
  • base64
  • webpack
  • nodejs
  • gulp
  • TensorFlow
  • 机器学习
  • 算法
  • 动态规划
  • 数据结构
  • Java
  • JavaScript
  • MongoDB
  • flutter
  • Git
  • linux
  • react
  • 前端杂烩
  • 男生女生
  • 算法
  • 十年饮冰,难凉热血
  • †少女癌†
  • 猫与向日葵
  • coderfun
  • JENKINS
  • API管理后台
愿你最终能接纳每一面每一种的自己
独自活着便是团圆