TS学习笔记(二)

为了解决any类型的污染问题,引入了unkown类型、它与any类型的相似之处在于,所有类型的值都可以分配给unkown类型。

let x:unknown;

x = true; // 正确
x = 42; // 正确
x = 'Hello World'  // 正确

它们的不同之处在于:

1、unknown类型的变量,不能直接赋值给其它类型的变量(除了any类型和unknown类型)

let v:unknown = 123;

let v1:boolean = v  // 报错
let v2:number = v  // 报错

2. unkown类型的变量不能直接调用方法和属性

let v1:unknown = {foo:1}
v1.foo // 报错

let v2:unknown = 'hello'
v2.trim() // 报错

let v3:unknown = (n=0)=>n+1
v3() // 报错

如上,连直接当做函数执行也不行。

。。既然这样,那unknown的作用是什么呢?就是为了替代any类型,或者或,更严格的any类型。意思就是声明的变量可以是任何类型。但是又不能调用方法和属性,感觉没啥用。

迁移旧的项目,或者哪个变量想暂时关闭类型检查都可以用。

3. unknown类型变量能够进行的运算是有限的。加减乘除这些都不能进行。

let a:unknown = 1;

a + 1 // 报错
a === 1 // 正确

 

想要进行这些运算只有经过‘类型缩小’才可以

let a:unknown = 1;

if (typeof a === 'number') {
  let r = a + 10; // 正确
}

 

 

let s:unknown = 'hello';

if (typeof s === 'string') {
  s.length; // 经过类型缩小后,也可以使用字符串的方法了
}

 

 

二、never类型

never类型也称为“空类型”,及不包含任何值。意思是不可能存在这样的值

let x:never;

给never类型的变量,赋给它任何值都会报错。

 

它的使用场景:

1. 在类型运算中,保证类型的完整性

2.不可能返回值的函数,返回值的类型就可以写成never。

 

never类型的一个重要特点是可以赋值给任意其他类型

let x:never;

let x1:string = x // 不报错
let x2:number = x  // 不报错
let x3:boolean = x  // 不报错

 

 

为什么never类型可以赋值给任意其他类型呢?这跟集合论有关,空集是任何集合的子集。TS规定,任何类型都包含了never类型

总之,TS有两个“顶层类型”(any和unknown),但是“底层类型”只有never唯一一个。

 

any 类型,unknown 类型,never 类型 - TypeScript 教程 - 网道 (wangdoc.com)

 

 
posted @ 2024-10-03 23:34  飞向火星  阅读(8)  评论(0编辑  收藏  举报