关于Typescript的一些特别类型

76 阅读1分钟

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()