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(); // 不报错
浙公网安备 33010602011771号