一、原始数据类型
js原始数据类型包括:布尔值、数值、字符串、null
、undefined
以及 ES6 中的新类型 Symbol和 BigInt。
ts中的原始数据类型包括:boolean、number、string、void、null、undefined
void表示没有任何返回值的函数。
null和undefined是所有类型的子类型,也就是说null和undefined能赋值给任一类型,如:let a: string = undefined
二、任意值Any和类型推导
any类型是可以赋值为任意类型,任意值可以访问任意属性和方法。
如果变量在声明时未指定类型和赋值,那么会默认为任意值类型,如果变量在声明时未指定类型但有赋值,则会进行类型推导。
三、联合类型
联合类型使用 |
分隔每个类型。如: let a: string | number
当不确定是哪个类型时,只能访问所有类型共有的属性和方法。
联合类型在赋值时,会根据类型推论的规则推断出一个类型。
四、接口
赋值时,变量的形状必须跟接口的形状保持一致,不能多也不能少属性,同时属性的类型一致。
可选属性可在定义的属性名后面加"?",可选属性可以不定义。
任意属性可以用[propName: string]来定义,一旦定义任意属性,确定属性和可选属性必须是其的类型子集。
只读属性可以用readonly定义,例:
interface A {
readonly b: string
}
只读属性不能单独赋值。
五、数组
声明数组的三种方法:
1、类型 + 方括号
let arr: number[] = [1,2]
2、数组泛型
let arr: Array<number> = [1,2]
3、接口
interface NumberArray {
[index: number]: number
}
let arr:NumberArray = [1,2]
any类型数组元素可以是任意类型
六、函数的类型
在 JavaScript 中,有两种常见的定义函数的方式:函数声明和函数表达式
//函数声明
function fn() {}
//函数表达式
let fn = function() {}
在ts中要对函数的输出和输入进行约束,如:
function sum(a: number, b:number): number {
return a + b
}
let sum:(a: number, b: number) => number = function(a: number, b:number):number {
return a + b
}
使用接口定义形状:
interface SumFunc {
(a:number, b:number): number
}
let sum: SumFunc
sum = function(a: number, b:number) {
return a + b
}
用"?"表示可选参数,可选参数后面不能出现必选参数
七、类型断言
使用: 值 as 型 或者 <类型>值
在 tsx 语法(React 的 jsx 语法的 ts 版)中必须使用前者,即 值 as 类型
。
- 联合类型可以被断言为其中一个类型
- 父类可以被断言为子类
- 任何类型都可以被断言为 any
- any 可以被断言为任何类型
若 A
兼容 B
,那么 A
能够被断言为 B
,B
也能被断言为 A
。
八、声明文件
通常我们会把声明语句放到一个单独的文件(x.d.ts
)中,这就是声明文件,声明文件必需以 .d.ts
为后缀。
declare var 声明全局变量
declare function 声明全局方法
declare clasee 声明全局类
declare enum 声明全局枚举类型
declare namespace 声明(含有子属性的)全局对象
declare global 扩展全局变量
declare module 扩展模块
九、type声明
用于类型别名和字符串字面量类型
十、定义元组
let t:[string, number]
十一、枚举
使用enum来定义:
enum Num {One, Two,Three}
枚举成员会被赋值为从 0
开始递增的数字,后面递增1,同时也会对枚举值到枚举名进行反向映射。
枚举项可以手动赋值,未手动赋值的枚举项会接着上一个枚举项递增。
十二、类
public
修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是public
的private
修饰的属性或方法是私有的,不能在声明它的类的外部访问protected
修饰的属性或方法是受保护的,它和private
类似,区别是它在子类中也是允许被访问的
abstract
用于定义抽象类和其中的抽象方法。抽象类是不允许被实例化的,抽象类中的抽象方法必须被子类实现
十三、泛型
指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性。
可以使用了 extends
约束了泛型 T
必须符合接口的形状进行泛型线束,如:
interface A {
a: string
}
function fn<T extends A>(n: T): T() {}
像以上只能传入拥有a属性的类型
十四、声明合并
如果定义了两个相同名字的函数、接口或类,那么它们会合并成一个类型。
合并的属性类型必须是唯一的。