什么是TypeScript?
Typescript 是一个强类型的 JavaScript 超集,支持ES6语法,支持面向对象编程的概念,如类、接口、继承、泛型等。Typescript并不直接在浏览器上运行,需要编译器编译成纯Javascript来运行。
使用ts的好处是什么?
它拓展了JavaScript的语法。所以ts的功能比js只多不少;
TypeScript的数据类型:
Boolean
Number
String
Array
Function
Object
Symbol
undefined
never
any、unknown、never、void、 null、 undefined的区别
any: 用于描述任意类型,不作任何约束,编译时会跳过对其的类型检查
unknown: 表示未知类型,即写代码的时候还不知道具体会是怎么的数据类型
never: 永不存在的值的类型,常用于表示永不能执行到终点的函数返回值,例如抛出异常或函数中执行无限循环的代码的函数返回值类型
void: 表示无任何类型,例如函数没有返回值或者返回值为undefined
undefined和null: 是所有类型的子类,可以把 null 和 undefined 赋值给 number 类型的变量。当你指定了 --strictNullChecks 标记,null 和 undefined 只能赋值给 void 和它们各自。
never
任何类型的值都不能赋值给never类型的变量,即使是any也不行,没有类型是never的子类型或可以赋值给never类型
// 抛出异常
function error(msg:string):never{
throw new Error(msg)
}// 抛出异常会直接中断程序运行,这样程序就运行不到返回值那一步了,即具有不可到达的终点,也就永不存在返回了
// 死循环
function loopForever():never{
while(true){}
} // 同样程序永远无法运行到函数返回值那一步 即永不存在返回
unknown 和 any的区别:
与any类似,所有类型都可以分配unknown类型
与any不同的是,unknown类型的变量不允许赋值给类型any或unknown以外的变量,也不允许执行unknown类型变量的方法
这种限制有很强的防御性,可以使用如下两种方法破解:
// 方法一:使用类型断言缩小未知范围
let notSure: unknown = 'TRY';
const resultNotSure = (notSure as string).toLowerCase();
console.log('resultNotSure', resultNotSure);
// 方式二:使用类型守卫进行类型收缩
let notSure: unknown = 'TRY';
if (typeof notSure === 'string') {
const resultNotSure = notSure.toLowerCase();
console.log('resultNotSure', resultNotSure);
使用枚举的好处:
使用枚举可以清晰地表达意图或创建一组有区别的用例
可读性强,语义化一些特殊的标记,如数字;
可维护性强,有修改只需要在枚举的地方修改,不会牵一发而动全身。
如何定义一个常量枚举?
常量枚举其实就是是在 enum关键字前使用 const 修饰符
const enum Enum1 {
枚举和常量枚举的区别
普通枚举: 在经过编译器编译后是一个对象,这个对象我们可以在程序运行时使用,使用者在编译阶段拿到的是枚举的引用;
常量枚举: 常量枚举会在编译阶段被移除,不会被编译成一个对象,常量枚举成员在使用的地方被直接内联进来(拿的不是引用,而是值)
枚举成员的值不可修改;
typescript 还支持反向映射,即可以通过值来获取键,可以通过 Enum1[key] 或者 Enum1.key 的方式获取到对应的值。不过反向映射只支持数字枚举。
const 用于变量, readonly 用于属性;
const 在运行时检查, readonly 在编译时检查;
const 声明的变量指向的那个内存地址不得改动,这意味着,const 一旦声明变量,就必须立即初始化,不能留到以后赋值;readonly 修饰的属性能确保自身不能修改属性,但是当你把这个属性交给其它并没有这种保证的使用者(允许出于类型兼容性的原因),他们能改变。
注: TypeScript 中的只读修饰符,可以声明更加严谨的可读属性。通常在 interface 、 Class 、 type 以及 array 和 tuple 类型中使用它,也可以用来定义一个函数的参数。
// 被readonly 约束的对象
const obj: { readonly a: number } = {
a: 1,
// 违背readonly 约束的可修改的函数
function setObjFn(obj: { a: number }) {
obj.a = 456;
setObjFn(obj);
declare