Typescript学习第二十一天

93 阅读2分钟

这是我参与2022首次更文挑战的第35天,活动详情查看:2022首次更文挑战

const类型断言

const类型断言语法expr as const<const>exprconst是关键字,expr关键字可以为number、string、boolean、bigint、枚举成员、数组或对象等字面量。也可以将expr表达式的类型转换为不可变类型。其中expr可以将stringbooleannumberbigint或者枚举成员字面量转为对应的字面量类型。如果是数组字面量可以转换为只读元组类型。如果是对象字面量可以全部转换为只读属性。可变值在编译器中可以编译以下。let声明非只读数组和对象都属于可变值,而const声明不属于可变值。

let x = true; // boolean
let y = true as const; // true
let z = [6, 6]; //number[]
let s = [6, 6] as const; // readonly[6, 6]

非类型断言使用的运算符!类型操作符。操作语法expr!,非空类型断言能够从类型中剔除undefinednull类型。我们使用isDefined工具函数去判断参数是否为undefined或null值。当参数值为undefined或null,那么直接返回0;否则返回的是v的长度。一般我们只在确定一个表达式的值不为空时才去使用非空类型断言。

类型细化

ts中可以对类型守卫、可辨识联合类型、赋值语句、控制流语句、断言函数类型进行细化。typeof运算符的返回值是一个字符串,主要用于获取操作数的数据类型。我们需要记住null类型返回值是object类型。typeof类型守卫在细化运算结果为object类型时,也会包含null类型。

function z(y: number[] | undefined | null) {
    if (type y === 'object') x;
    else x;
}

instanceof类型守卫会根据instanceof运算符的返回值将左操作数的类型进行细化。而且还能够检测实例对象与构造函数之间的关系。如果左侧的数为实例对象,右操作数为构造函数,若构造函数的prototype属性值存在于实例对象的原型链上,则返回true;否则为false。如果参数是一个正则表达式实例,那么将类型细化为RegExp类型。而且也可以细化自定义构造函数,并对实例对象进行类型细化。

class Z {}
class S {}
function y(p: Z | S) {
    if(p instanceof Z) {x;}
    if(p instanceof S) {x;}
}

in运算符用来判断对象自身或其原型链中是否存在给定的属性,如果存在会返回true,否则会返回false。in运算符左侧是待测试的属性名,右侧是测试对象。