携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
1.常用基础类型
1.js已有类型
1.基础类型:number,string,boolean,null,undefined,symbol
2.引用类型:对象,数组,函数
2.ts新增类型
1.联和类型,自定义类型,接口,元组,字面量类型,枚举,void,any
2.ts新增的类型
2.1接口
当一个对象类型被多次使用时,一般会使用接口来描述对象的类型,达到复用
语法:1.用interface 关键字声明接口
interface Iperson {
name: string
age: number
}
let person: Iperson = {
name: 'ZZ',
age: 18
}
1.interface和type的区别:
interface(接口)和type(类型别名)的区别:
1.相同点:都可以给对象指定类型
2.不同点:
接口:只能为对象指定类型
类型别名:可以为任意类型指定别名 (对象时可以用接口/类型别名,其他类型只能用类型别名)
interface Iperson {
name: string
age: number
}
type Iperson = {
name: string
age: number
}
type NumStr=number | string
let person: Iperson = {
name: 'ZZ',
age: 18,
}
let age:NumStr=12
3.可选属性,只读属性,任意属性
1.可选属性 ?表示
interface Person {
height: number
with?: number
}
let zhang: Person = {height: 123}
2.只读属性
1.属性名前用 readonly来指定只读属性
2.ReadonlyArray指定数组为只读
3.readonly vs const
interface Person {
readonly color: string
with?: number
}
let zhang: Person = {color: 'red'}
zhang.color='blue' //error只读
ReadonlyArray指定数组为只读
1.ReadonlyArray<T>类型,它与Array<T>相似,只是把所有可变方法去掉了
let a: number[] = [1, 3, 4, 5]
let newA: ReadonlyArray<number> = a
newA[0] //error只读
newA.push(6) //error只读
2.把readonlyArray类型赋值到普通数组不可以,可以使用断言重写
let a: number[] = [1, 3, 4, 5]
let newA: ReadonlyArray<number> = a
let b = []
b = newA //error
b = newA as number[]
readonly vs const
它做为变量使用还是做为一个属性
做为变量使用的话用 const,若做为属性则使用readonly
3.任意属性
无法预先知道有哪些新的属性的时候,可以用
注意:1.一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集
2.一个接口中只能定义一个任意属性。如果接口有多个类型的属性,可使用联合类型
1.interface Person {
name: string
age: number
[propName: string]: string
}
let jing: Person = {
name: 'jignjign',
age: 25,
gender: 'sex'
}
//error 报错,因为age是number类型与[propName: string]的string不一致
2.修改
interface Person {
name: string
age: number
[propName: string]: string | number
}
3.继承extends:
如果两个接口之间有相同的属性或方法,可以将公共的属性抽离出来,通过继承实现复用
1.与类一样,接口也可以相互继承
2.一个接口可以继承多个接口,创建出多个接口的合成接口
interface p1{x:number,y:number}
interface p2{x:number,y:number,z:number}
interface p3 extends p1{z:number}
//继承多个接口
interface Person {
name: string
age: number
}
interface Person1 {
content: string
}
interface PersonSon extends Person, Person1 {
gender: string
}
2.2 元组(Tuple)
元组:是一个已知数量长度,类型的数组,各个元素的类型可以不同
元组类型时另一种类型的数组,元组继承于数组,但是比数组拥有更严格的类型检查。
它确切的知道包含了多少个元素,以及特定所有对应的类型。
let position: [number, string] = [1, '123']
let position: [number, number] = [1, 2]
2.3 字面量类型
字面量类型:某个特定的字符串也可以作为TS中的类型 除字符串外,任意的js字面量(比如:对象,数字等)都可以做为类型使用
let str='hello' 变量,类型是string
const str='hello' 常量,类型是 hello,
因为const 是常量不能变所以类型是hello
1.使用场景:字面量类型配合联合类型一起使用用来表示一组明确的可选值列表
eg:在贪吃蛇中,游戏的方向只能是上下左右中任意一个
function chang(direction: 'up' | 'down' | 'left' | 'right') {
console.log(999, direction)
}
chang('up')
2.4 枚举类型(enum)
1.作用:枚举用于表示固定的几个取值可以表示一组明确的可选值,枚举的功能类似于字面量类型+联合类型组合的功能 2.枚举:enum关键字 定义一组命令常量,它描述一个值,该值可以是这些命名常量中的一个大写字,逗号隔开, 3. 使用枚举:通过 . 访问枚举成员 4.使用场景:使用一组明确的可选值
1.定义枚举
enum Direction {
Up,
Down,
Left,
Right
}
function changF(direction: Direction) {
console.log(888, direction)
}
changF(Direction.Up)
5.枚举成员的值 枚举成员的值,鼠标移入枚举成员上就可以看见 枚举默认是数字枚举
1.数字枚举
数字枚举:枚举成员的值是数字 字符串枚举有自增长,默认为:从0开始自递增
1.手动初始化枚举
enum gender { male=2,female }
可以手动赋值从2开始为元素赋值: male==2,female==3
enum gender { male=2,female=4 }
可以全部手动赋值: male==2,female==4
3.获取元素对应得值
enum gender { male=2,female=4 }
let val = gender.male //2
4.根据值映射相应得字段名称
enum gender { male=2,female=4}
let val = gender[4] //female
2.字符串枚举
类似于数字枚举但 字符串不支持正反向映射 字符串枚举:枚举成员的值是字符串 字符串枚举没有自增长,每个成员必须有初始值
1.定义枚举
enum season {
spring = 'a1',
summer = 'a2'
}
2.获取元素对应得值
let val = season.spring //al
3.常量枚举
在编译阶段就会被移除,没有对应的js 场景:当不需要一个对象,而只需要对象的值时,可使用常量枚举。会减少在编译环境上的代码
1. 用const定义
const enum season {
spring,
summer
}
枚举的特点与原因: 枚举不仅仅当作类型,还提供值,所以说在编译成js代码时不会自动一出,而是会被编译成js代码(开销更大)
4.任意类型(any)
声明为 any 的变量可以赋予任意类型的值 检查器不会对类型进行检查 不推荐使用,失去ts的保护
let list: any[] = [1, true, "free"];
let sum:any = 12;
``