number / string / boolean / bigint / symbol
和 JavaScript 中一样
let n: number = 1
let str: string = 'str'
let bool: boolean = true
let bigint: bigint = 123n
let symbol: symbol = Symbol()null / undefined
它们的行为取决于配置项 strictNullChecks:
- 关闭:如果一个值可能是 null 或者 undefined,它依然可以被正确的访问,或者被赋值给任意类型的属性
- 开启(推荐):如果一个值可能是 null 或者 undefined,需要在用它的方法或者属性之前,先检查这些值,就像用可选的属性之前一样
object
表示任何非原始数据类型
字面量类型(Literal Types)
具体到某个字面值的类型,可以是 字符串、数字、布尔值(可以和联合类型相结合使用)
使用 let 或 var 声明的变量类型自动推导为其数据类型,而 const 会推导为字面量类型:
let a = 'hello world' // a: string
const b = 'hello world' // b: 'hello world'any
任意类型,不会进行类型检查,基本不用
声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值
开启配置项 noImplicitAny 避免隐式赋值为 any 类型
unknown
any 赋值给其他变量时会污染其他变量,所以引入 unknow 类型,对 unknown 类型的值做任何事情都是不合法的,可以看作是更安全的 any
要对 unknown 进行操作,必须先进行 类型收窄(Narrowing)
never
表示空集,never 类型可以赋值给任何类型,任何类型都不能赋值给 never(除了它自身)
用处:
- 在分支处理中作为兜底,后续变量变化时如果分支中不处理就会报错,从而发现隐藏错误
- 函数内部异常报错,没有返回值
- 在条件运算中表示空,丢弃
联合类型(Union Types)
表示取值可以为多种类型中的一种,使用
|分隔每个类型
访问联合类型共有的属性或方法是可以的,否则需要在使用前先判断类型
function myfunc(id: string | number): string {
return `hello world, ${id}`
}
// 下面都可以
myfunc("123456")
myfunc(123456)类型别名(Type Aliases)
如果多次使用同一个类型,可以通过一个别名来引用,别名不允许重名
type Person = {
name: string
age: number
}
function myfunc(obj: Person): string {
return `hello world, ${obj.name}: ${obj.age}`
}枚举(enum)
需要定义一组相关的常量时使用
Enum 结构的特别之处在于,它既是一种类型,也是一个值。绝大多数 TypeScript 语法都是类型语法,编译后会全部去除,但是 Enum 结构是一个值,编译后会变成 JavaScript 对象,留在代码中。
// 编译前
enum Color {
Red, // 0 ,值默认从 0 开始,后续递增
Green, // 1
Blue // 2
}
// 编译后
let Color = {
Red: 0,
Green: 1,
Blue: 2
};
let c = Color.Green; // 1
// 等同于
let c = Color['Green']; // 1使用场景:成员的值不重要,名字更重要,从而增加代码的可读性和可维护性
取出 enum 的所有 key 的类型:type T = keyof typeof Color