持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天
作者:Sean
前言:TypeScript,简称 ts,等于 type + JavaScript,有了 type 的 JavaScript 就像时刻有绿码在手的你(大误)。
ts 可以保证在编译时就检查代码中的类型错误和问题,大大减少了空指针异常等问题,而 JavaScript 只能在运行时发现错误 2022 年了,还不会 ts 你就落伍了!
一、接触 TypeScript
获取 TypeScript
# 安装ts
npm install -g typescript
# 验证ts
tsc -v
# 编译ts文件,生成对应js文件
tsc xxx.ts
二、TypeScript 类型
2.1 JavaScript er 熟知的类型
string, number, boolean, null, undefined, Object, Array, Function, Date......
const str: string = 'a'
const n: number = 1
const flag: boolean = true
const nil: null = null
const undef: undefined: undefined
const date: Date = new Date()
const obj: { name: string } = { name: 'jack' }
const arr: string[] = ['ok', 'success', 'real']
const fn: (a: number) => string = (a: number) => `${x} hhhh`
这些类型对写惯 js 的程序员可能会觉得很熟悉,没有多少门槛,那 ts 只会止步于此吗?
2.2 TypeScript 中新增的类型
tuple, never, unknown, any, enum
tuple 元祖
const tup: [string, number] = ['ok', 2]
[string, number] 代表的就是一个二元组,指的是第一个元素是字符串类型,第二个元素是数字类型的数组,有且只能有两个元素。以此类推,还有三元组,四元组,n 元祖......
never
never类型正如字面意思,永远无法触达的类型,在实际使用中,一个变量如果是 never 类型,则它无法做任何事。后面介绍交叉类型时会再次回顾这个类型。
如果无法使用,那never不是没有用处吗?
当然不是,在做各种类型体操时,never会起到很大的作用,这一点以后会再次介绍。
enum 枚举
enum Staus {
todo = 0,
doing,
done,
}
let status: Status = 0;
status = Status.doing;
console.log(status); // 1
Status 实际表达的是一个{ todo: 0, doing: 1, done: 2 }的枚举
enum的使用场景都有哪些呢?
- 数字映射
- 位运算
any 任意
当一个变量为 any 类型,它可以是任何类型(废话) 那岂不是跟 js 一样了? 确实,使用了 any,让你一键还原到 JavaScript
通常,不建议在任何场景使用 any,因为一个变量类型为 any,使用到这个变量的其他变量的类型也会变成 any,一个 any 会生出一窝 any。我们使用 ts 的目的就是类型检查,使用 any 就失去了使用 ts 的意义。
那有些场景我真的不知道该使用什么类型啊
那你可以使用 unknown 啊
unknown 未知
小白:emmmmm,未知是个什么类型???
大佬:你不是不知道你要用的是什么类型吗,所以给你个 unknown 啊
小白:哦。。。哎?不对啊,我这变量声明成 unknown 类型怎么什么也做不了啊
大佬:对啊,声明的时候未知,使用的时候要先缩窄确定成具体类型才能用啊
小白:哦。。。好像懂了,好像也没懂
大佬:没事,后面看到具体例子就知道了
let a: unknown;
a.toFixed(); // 报错,未知类型没有toFixed方法
if (typeof a === 'number') {
a.toFixed(); // ok, if判断语句已经把a类型收窄成number类型了
}
所以 unknown 也可以称为安全的 any
三、结语
只看这些简单类型,ts 是不是跟 js 很相似呢?只不过是是在声明各种变量时加上类型了。
下一期会介绍稍微高级的 TypeScript 类型,包括联合类型,交叉类型,类型声明等,尽情期待。