TS类型2——类型声明
Posted 勇敢*牛牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TS类型2——类型声明相关的知识,希望对你有一定的参考价值。
对象类型 object
let obj: object =
let obj:id:number,name?:string // ?可选
// id是必须要有的,后面可以任意key,key为字符串,值为任意类型
let obj:id:number,[props:string]:any
- 属性的可选性
- 动态属性,可能还存在多个
let arg: id: number; name: string; [key: string]: any
arg = id: 1, name: 'aaa'
arg['sex'] = '0
- 对象的兼容性 — 【一个类型是另一个类型的子集/范围广的赋值给范围少的】 如果你想把一个类型赋值给另一个类型,则前提是,你当前类型中所有的属性在接受变量类型中都有
接受者是赋值者的超集就可以
let arg1: id: number; name: string; age: number
let arg2: id: number; name: string
let arg3: id: number
// 不会报错
arg3 = arg2
数组类型 Array
定义一个指定类型的数组 指定类型,没有指定长度,它称为数组
let list: number[] = [1, 2, 3];
Array<类型> 泛型 定义指定类型的数组
let list: Array<number> = [1, 2, 3];
元组类型 tuple
它是数组一个种特殊的方式,元素类型及数量是确定的
let arg: [number, string]
arg = [1, 'a']
// 元组只能是定义出来的,推导出来的,都为数组
let arg2 = [1, 'a']
自定义类型 type 它是可以导出
- 通过type关键字完成自定义类型的定义 type定义的类型,在同一个模块下面,名称是不能重名的
定义类型给变量用
type UserType = id: number; name: string; age: number
let arg1: UserType
let arg2: UserType
定义一个类型来限制函数的参数类型和返回的类型
定义的参数类型限制,它只限制类型,不限制你所定义的形参的名称
type FnType = (a: string, b: number): string
type FnType = (a: string, b: number) => string
const fn: FnType = (id: string, name: number) =>
return 'hello'
限制构造函数参数的类型
表示当前一定它是一个类,可以被实例化,且能用new来实例,并且限制了它的构建函数参数类型
type PersonType = new (id: number): void
class Person
constructor(id: number)
let Person1: PersonType = Person
let ds = new Person1(1)
联合类型 多个类型可以选择的 类型和类型之间用 | 隔开
此变量可以赋值的类型可以是number,也可以是string,还可以是boolean
let arg: number | string | boolean | string[]
联合类型中有unknown或any ,任何的类型和它俩联合都是转为 unknown或any
联合类型中有unknown或any ,任何的类型和它俩联合都是转为 unknown或any
let arg: string | unknown // unknown
let arg: string | any // any
联合类型中有 never 类型,它是不会生效,写和不写没有区别,相当于不存,类型检查时也不会有
let arg: number | string | boolean | string[] | never
交叉类型—— 取两个类型的交集
type type1 = number | string
type type2 = string | boolean
//交叉类型 取两个类型的交集
type type3 = type1 & type2// string
注意:如果是对象类型,进行交叉,得到是一个并集操作
type type1 = id: number; name: string
type type2 = age: number
// id:number,name:string,age:number
type type3 = type1 & type2
let t: type3 = id: 1, name: 'aa', age: 1
- 如果对象类型中,属性的名称和类型相同的情况 进行合并
- 如果对象类型中,属性的名称相同,但类型不相同的情况,进行合并, 把类型变成never类型
使用交叉类型来扩展属性
type Slice =
name: string
type ExtSlice = Slice &
username: string
const userSlice: ExtSlice =
name: 'aa',
username: 'admin'
断言 断定某一个类型或值 语法 [值 as 类型] 或 [<类>值]
function fn(arg)
// string类型上面是有length属性,但是number它没有,所以你直接用,它就会报错,number也是有可能的
// 类型保护
if (typeof arg === 'string')
return arg.length;
return arg;
console.log(fn("23"));
断言 类型断言
function fn(arg: number | string)
// string类型上面是有length属性,但是number它没有,所以你直接用,它就会报错,number也是有可能的
// 断言它现在一定是一个string类型的变量
return (<string>arg).length//注意优先级
return (arg as string).length
console.log(fn("23"));
值断言
- 属性暂时可能没有赋值,但是后续我一定会赋值给它,所以可以用一个断言 非空
class Person
// 属性暂时可能没有赋值,但是后续我一定会赋值给它,所以可以用一个断言 非空
name!: string
// constructor(name: string)
// this.name = `在这里插入代码片`name
//
链判断符 ?. js也是有的 es10提供
let a = b: 1,c:null
a.c?.d
以上是关于TS类型2——类型声明的主要内容,如果未能解决你的问题,请参考以下文章