TypeScript 学习笔记(1):基础类型和几个特殊类型

420 阅读4分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战


前言

最近接触的新项目应用了 TypeScript,囫囵吞枣的看了一点 TS 教程就直接上手了。因为有前辈们栽的树,参照着写基本没啥大问题,大部分就是加个基础类型声明。但是吧,写得多了总会碰到那么一些复杂的结构,就不会写了。

比如说:嵌套的数组和对象、函数的参数和返回值,又或者是没有声明类型的对象数组,TS 自动做了类型推断,导致后面添加的数组对象成员出现类型报错(对象属性不完全一致);有些地方会直接丢个 any 去规避类型检查的报错,但这样 TypeScript 就没意义了呀。TypeScript 是个好东西,这点我在写项目的过程中深有体会。所以嗯,我得弄明白这些,然后利用好 TypeScript,让它的价值得以充分发挥。👩‍💻

理论性的话不多说(要说俺也不会),主要就是看看写法。下面就结合各种场景,看看怎么用吧。🤣

TypeScript 类型注解

TypeScript 其实就是添加了类型注解的 JavaScript。咱们先来了解下都有哪些类型,以及这些类型注解怎么使用 ——

简单的基础类型:string、number、bigint、boolean、symbol

注意:虽然 number 和 bigint 都是数字类型,但二者并不兼容。
嗯,这几个简单,好像没啥好说的,快速过一下得啦。

let str:string = 'foo'
let int:number = 6;
let big:bigint =  100n;
let bool:boolean = true;
let sym:symbol = Symbol();

其他特殊类型:any、unknown、void、null、undefined、never

any

咱们或许可以称之为“作弊类型”。any 类型会绕过静态类型检测,可以把任意类型的值赋值给 any 类型的变量,也可以把 any 类型的变量赋值给任意类型(除 never)。

//以下都不会有错误提示

let sth:any = []
sth = 1
sth = 'bar'

let num:number = sth
let str:string = sth

那不等于类型检测没用啦?为什么要提供这种类型?是的,咱们应该尽可能避免使用 any 类型,但 any 类型又是必要的,比如说引入一个没有类型注解的第三方库的时候、或者在JS 项目逐步升级到 TS 的过程中,any 可以帮我们选择性的忽略一些类型检测。

但是切记!🚨 非必要情况,避免使用 any。

unknown

unknown 用于描述类型不确定的变量。但它跟 any 不一样,我们可以把任意类型的值赋值给 unknown 类型,但 unknown 类型的变量只能赋值给 unknown 或 any 类型

像下面这种,需要在执行过程中才得出 res 类型的情况, unknown 就可以出场啦。

let res:unknown;
if(...) {
    res = 123
}else if(...){
    res = '123'
}else{
    res = [1,2,3]
}

🚨 注意在 unknown 类型判断出具体类型之前,对 unknown 做任何操作都会报错。因此,在使用 unknown 类型的数据之前,需要显式指定类型,或是现有条件足以进行隐式类型推断也行。

// 错误示例:
let a: unknown;
// Type 'unknown' is not assignable to type 'number'.ts(2322)
const b: number = a;

所以说 unknown 类型会比 any 更加安全:虽然它和 any 一样存储了任意类型的值,但在具体使用之前,这个类型需要显式确定(类型缩小)。

想了解更多 unknown,参见:www.cnblogs.com/Wayou/p/typ…

void、null、undefined

void 用于表示没有返回值的函数
null、undefined 仅用于表示与其同名的 null、undefined 变量,通常会在定义接口的时候使用它们:undefined 用于表示缺省的、未定义的属性;null 表面对象或属性可能是空值。

never

never 表示永远不会发生值的类型。使用场景,如下面这个仅用于抛出错误的函数:

function throwErr(msg:string):never{
    throw Error(msg)
}

never 是所有类型的子类型,它可以给任意类型赋值;但相反,除了 never 本身,任何类型都无法给 never 类型赋值。


下集预告

嗯,由于时间关系(篇幅也够用了),明天继续嗷 😉

明天的更新计划:

  • 复杂的类型:object、Array(数组)、Tuple(元组)
  • 函数:参数和返回值的类型声明