any,unknown,never

108 阅读2分钟

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所有类型
unknownany或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; // 正确
}