any 类型
any 类型表示没有任何限制,该类型的变量可接受任意类型的值。
let anyV:any
anyV = 1
anyV = true
变量类型一旦设为any,TypeScript 实际上会关闭这个变量的类型检查。即使有明显的类型错误,只要句法正确,都不会报错,由于这个原因,应该尽量避免使用any类型
let x:any = 'hello';
x(1) // 不报错
x.foo = 100; // 不报错
any的类型推断问题
1.声明但未宣告类型的变量,类型推断为any
let anyV //类型推断为any
2.无法推断出类型的变量类型为any
// a&b推断为any导致函数的结果也无法推断,因此结果类型也为any
function x (a,b) {
return a + b
}
console.log(x(1,[12]));
$ tsc --noImplicitAny app.ts打开该选项,只要推断出any类型就会报错,let || var声明后但未赋值的变量类型推断为any不会报错
let anyV //类型推断为any,不报错
污染问题
any可以赋值给任意类型
let anyV:any = true
// 污染导致的后续问题
let age:number = anyV //不报错
age * 123 //不报错
age.toFixed() //不报错
unknown 类型
为了解决any类型“污染”其他变量的问题,Ts引入了unknown类型
| 类型 | 可接受任意类型的值 | 可赋值的类型范围 |
|---|---|---|
| any | ✓ | 所有类型 |
| unknown | ✓ | any或unknown |
1.2 unknown类型变量不能直接调用.
unknowV = {uname:'w s'}
//不能直接调用属性
unknowV.uname
//不能直接调用方法
unknowV.uname.trim()
//不能调用函数
unknowV = (n = 1) => n + 1
unknowV()
1.3 unknown类型可使用的运算符
只能进行比较运算(运算符==、===、!=、!==、||、&&、?)、取反运算(运算符!)、typeof运算符和instanceof
let a:unknown = 1
a + 1 // 报错
怎么才能使用unknown类型变量呢?
只有经过“类型缩小”,确定unknown变量类型才可以使用.
这样设计的目的是,只有明确unknown变量的类型,才允许使用它,防止像any那样可以随意乱用.
//确定unknowV为函数
if(typeof unknowV == 'function')unknowV()
let price:unknown = 10
console.log(price++);//报错
//确定price为数字后才能使用
if(typeof price == 'number')console.log(price++);
let s:unknown = 'hello';
if (typeof s === 'string') {
s.length; // 正确
}