1、any any如字面意思就是代表所有的类型 含括了string、number、object...全部类型
2、unknown unknown则代表未知类型 但是可以进行二次断言 适合当数值是外部获取,获取前无法得知类型
type A:unknown = 1;
(A as number).toFixed()
3、never never则代表什么也不是什么也没有 一般用在排查错误的时候使用
type A:number | string | boolean
if(typeof A === 'number'){}
else if(typeof A === 'string'){}
else if(typeof A === 'boolean'){}
else { 则等于never}
4、 enum 简单理解就是枚举 则代表一个产品的类型状态
enum A{
todo = 0, <- 这里必须逗号分隔
done,
archived,
deleted
}
let status: A =0;
status = A.tudo;
另一种就是权限的控制
enum Permission{
None = 0, // 0000 <- 此处数字代表二进制
Read = 1 << 0, // 0001
Write = 1 << 1 , // 0010
Delete = 1 << 2 , //0100
Manage = Read | Write | Delete, // 0111
}
type User = {
permission: Permission;
}
const user:User = {
permission: 0b0101 //0b开头通常就代表二进制
}
if((user.permission & Permission.Write) === Permission.Write) {
console.log('有写的权限')
}
if((user.permission & Permission.Manage) === Permission.Manage) {
console.log('有管理的权限')
}
5、type 比较特别的是在用type声明一个函数的时候可以有更具体的写法 在面试中提问则需要说只是给类型取了一个别名
type FnWithProp = {
(a:number, b:number) : void // void代表返回值
prop: string
}
因为定义了prop 所以在使用这个函数类型的时候也需要添加prop的内容
const f:FnwithProp = (x,y) => {
return x * y
}
f.prop = 'hello'
6、interface 面向对象 OOP oriend object p { class function extension} 当需要描述对象的属性的时候使用 且interface只描述对象
在interface跟type的区别 interface是真实声明的 而type仅仅只是别名 type有一个特性 不允许重新赋值 type A = number ; 这部分是不允许的 A = string XXX 不允许 而interface的优点是可以扩展属性
type A1 = Array<string> & {
name: string
} & x
===
interface X {
age: number
}
interface A2 extends Array<string>, X{
name :string
}
interface可以自动合并
interface A{ name : string}
interface A{ age: number}
const b:A = { name :'frank', age:18}
更重要的用法是用来扩展全局属性Api或者是在写对外开放的Api的时候方便他人使用修改的情况下使用
declare global { //大多情况下会写在 xxx.d.ts的文件中 d则代表全局文件
interface String{
padZero(x:string) : void
}
}
const A = ' hello '
A.padZero()