【TypeScript】TS类型声明(四)

2023-11-28 14:11:04 浏览数 (1)

any(任意类型)


声明变量类型为any

  • 编译时会绕过所有类型的检测,直接通过编译阶段的检查
  • 可以任意访问属性的方法和属性
  • any类型可以赋值给任意类型
  • 如果变量初始没有定义类型,默认为any;经过赋值后,TS会根据赋值类型来标识变量的类型
代码语言:text复制
let anyValue: any = 1;
//修改变量类型
anyValue = true;
//赋值给任意类型,比如boolean
let booleanValue: boolean = anyValue;
console.log(booleanValue)//true

any在使用过程中就像一个潘多拉魔盒,即使使用了断言,也丧失了在静态类型检查阶段发现错误的可能性。

unknow(未知类型)


声明变量类型为unknow

  • 安全性更高
  • 它用于描述类型不确定的变量,这与any类型相似,但更安全,因为对未知值做任何事情都是不合法的
  • unknown类型只能赋值给anyunknown类型,any类型可以赋值给任意类型
  • unknownnever 都不允许执行变量的方法以及访问内部属性
  • unknown没有被断言或细化到一个确切类型之前,unknown不可以赋值给其它类型,除了它自己和any外,当然也都是不允许在其上进行任何操作的。
代码语言:text复制
let unknownValue: unknown;
//对变量进行任意赋值
unknownValue = true;
unknownValue = 'sss';
unknownValue = 1;
//赋值给unknown类型的变量
let testValue1: unknown = unknownValue;
//赋值给any类型的变量
let testValue2: any = unknownValue;

错误示范:

代码语言:sql复制
//赋值给boolean类型的变量,报错,因为unknown类型只能赋值给unknown、any
let testValue3: boolean = unknownValue;//报错

虽然可以对unknown类型的变量进行任意赋值,但是却不能执行任何操作,如何解决这个问题呢?可以缩小unknown类型。具体如下所示:

代码语言:go复制
type func = ()=> unknow
let test = func();
if(test instanceof func){
//执行逻辑
}

我们可以用断言缩小未知范围或者可以用instanceof来缩小变量的类型,强制让ts编译器相信我们在做什么操作

void(空类型)


声明对象类型为void

  • 返回为空值
代码语言:c#复制
function func(): void { }

声明一个变量为void 时

  • 只能将它赋值为 undefined 和 null,因此在定义函数的返回值为void时,也可return undefined/null
代码语言:text复制
let voidValue1: void = undefined;
let voidValue2: void = null;

never(不存在的值类型)


never类型表示永不存在的值的类型。具有以下特点:

  • never类型是所有类型的子类型,即never类型可以赋值给任何类型。
  • 其他任何类型均不是never类型的子类型,即其他类型均不可赋值给never类型,除了never本身。即使any类型也不可以赋值给never类型。
  • 返回类型为never的函数中,其终点必须是不可执行的,例如函数过程中抛出了错误或者存在死循环。
  • 变量也可以声明为never类型,但其不能被赋值

设置变量类型为never,表示永远不能执行完或者永远Error,具体示例如下:

  • 函数中出现了死循环,永远不能执行完,因此其函数类型为:() => never
代码语言:text复制
function infiniteLoop(): never {
	while (true) { }
	return 'over'
}
  • 函数中出现报错,不会执行到return over,因此其函数类型为:() => never

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞