TypeScript学习第一天

一、顶层类型
1.any类型
any类型表示没有任何限制,该类型的变量可以被赋予任意类型的值
从集合论角度看,该类型是其他一切类型的全集

  • 类型推断问题
var x; // 不报错
let y; // 不报错

上面的x和y都没有赋值,即被推断为any类型

let x;

x = 123;
x = { foo: 'hello' };

const声明的变量必须同时进行初始化

const x; //报错
  • 污染问题
    类型为any的变量可以任意赋值给其他类型的变量,这会引起变量类型污染,导致其他变量没有预期的效果
let x:any = '123';
let y:number;

y = x; // 不报错
y*123; // 不报错
y.toFixed() // 不报错

2.unknown类型
该类型和any类型类似,但是比any类型更为严格

  • 限制一:unknown类型的变量,不能直接赋值给其他类型的变量(除了any和unknown)
主要是为了限制any类型变量污染的问题
let v:unkonwn = 123;
let v1:boolean = v // 报错
let v2:number = v  //报错
  • 限制二:不能直接使用unkonwn类型的属性和方法,或当前函数执行,都会报错
let v1:unkonwn = {foo:1};
v1.foo  //报错

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

let v3:unknown = (n=0)=>n+1;
v3() //报错
  • 限制三:unkonwn类型能进行的运算是有限的,只能进行比较、取反、typeof、instanceof运算,其他运算都会报错
let v1:unknown = 1;
v1 += 1;  // 报错

v1 === 1 // 正确

只有缩小unknown类型的类型范围,才能进行其他运算

let v1:unknown = 1;
if (typeof v1 === 'number'){
  v1 += 2;
}

3.never类型(底层类型)
从集合角度来说,该类型代表空集
该类型值为空,即不可能有这样的值

function test(x:number|string){
  if (typeof x === number) {
      ....
  } else if (typeof x === string) {
    ...
  } else {
    //  x never类型
  }
}

该类型的特点是可以任意赋值给其他类型,空集是任何集合的子集

function f():never {
  throw new Error('Error');
}

let v1:number = f(); // 不报错
let v2:string = f(); // 不报错
let v3:boolean = f(); // 不报错
posted @ 2024-05-29 10:46  YuanYF6  阅读(7)  评论(0)    收藏  举报