ts概述、ts环境准备和编译、ts类型声明( 四 )


3.12 自定义类型type
自定义类型给变量用:
// 通过type关键字完成自定义类型的定义type定义的类型 , 在同一个模块下面 , 名称是不能重名的// 定义类型给变量用type UserType = { id: number; name: string; age: number }let arg1: UserTypelet arg2: UserTypelet arg3: UserType

ts概述、ts环境准备和编译、ts类型声明

文章插图
自定义类型给函数用:
// 定义一个类型来限制函数的参数类型和返回的类型// 定义的参数类型限制 , 它只限制类型 , 不限制你所定义的形参的名称// 写法1:// type FnType = { (a: string, b: number): string }// 写法2:type FnType = (a: string, b: number) => stringconst fn: FnType = (id: string, name: number) => {return 'hello'}
限制构造函数参数的类型:
// new (id: number) 限制构造函数参数的类型,表示当前一定它是一个类 , 可以被实例化 , 且能用new来实例 , 并且限制了它的构建函数参数类型// 注意:自定义类型也可以进行模块化导出export type PersonType = { new (id: number): void }class Person {constructor(id: number) {}}let p: PersonType = Person
3.13 联合类型
多个类型可以选择的 , 类型和类型之间用|隔开
// ----------------------- 联合类型多个类型可以选择的 类型和类型之间用 | 隔开// 此变量可以赋值的类型可以是number , 也可以是string,还可以是boolean// let arg: number | string | boolean | string[]// 联合类型中有unknown或any  , 任何的类型和它俩联合都是转为 unknown或any// let arg: string | unknown // unknown// let arg: string | any // any// 联合类型中有 never 类型 , 它是不会生效 , 写和不写没有区别 , 相当于类型不存在 , 类型检查时也不会有// number | string | boolean | string[] , 这个类型相当于下面这种写法let arg: number | string | boolean | string[] | never
3.14 交叉类型
取两个类型的交集 。
普通变量进行交叉:
type type1 = number | stringtype type2 = string | boolean// stringtype type3 = type1 & type2
如果是对象类型 , 进行交叉 , 得到是一个并集操作:
type type1 = { id: number; name: string }type type2 = { age: number }// {id:number,name:string,age:number}type type3 = type1 & type2let t: type3 = { id: 1, name: 'aa', age: 1 }
注意:对象类型的交叉 , 最好保证属性名如果重名 , 则类型相同或是一个联合类型
如果对象类型中 , 遇到属性的名称和类型相同的情况 , 则会直接进行合并 , 例如下面的例子直接会把id:合并为一个类型限制:
type type1 = { id: number; name: string }type type2 = { id: number; age: number }// {id:number,name:string,age:number}type type3 = type1 & type2let t: type3 = { id: 1, name: 'aa', age: 1 }
如果对象类型中 , 遇到属性的名称相同 , 但类型不相同的情况 , 则会把类型不同的属性限制为 never 类型:
type type1 = { id: number; name: string }type type2 = { id: string; age: number } // 把 id 的类型变成 never 类型// 注意:type type2 = { id: number|string; age: number }  , 这种情况下 , id 的类型为 number// {id:never,name:string,age:number}type type3 = type1 & type2// let t: type3 = { id: 1, name: 'a', age: 20 } // 报错,id无法来赋值