美文网首页
TypeScript 详解之 any 类型,unknown 类型

TypeScript 详解之 any 类型,unknown 类型

作者: you的日常 | 来源:发表于2023-08-08 09:26 被阅读0次

any 类型

基本含义

any 类型表示没有任何限制,该类型的变量可以赋予任意类型的值。

let x:any;

x = 1; // 正确
x = 'foo'; // 正确
x = true; // 正确

上面示例中,变量x的类型是any,就可以被赋值为任意类型的值。

变量类型一旦设为any,TypeScript 实际上会关闭这个变量的类型检查。即使有明显的类型错误,只要句法正确,都不会报错。

let x:any = 'hello';

x(1) // 不报错
x.foo = 100; // 不报错

上面示例中,变量x的值是一个字符串,但是把它当作函数调用,或者当作对象读取任意属性,TypeScript 编译时都不报错。原因就是x的类型是any,TypeScript 不对其进行类型检查。

由于这个原因,应该尽量避免使用any类型,否则就失去了使用 TypeScript 的意义。

实际开发中,any类型主要适用以下两个场合。

(1)出于特殊原因,需要关闭某些变量的类型检查,就可以把该变量的类型设为any

(2)为了适配以前老的 JavaScript 项目,让代码快速迁移到 TypeScript,可以把变量类型设为any。有些年代很久的大型 JavaScript 项目,尤其是别人的代码,很难为每一行适配正确的类型,这时你为那些类型复杂的变量加上any,TypeScript 编译时就不会报错。

总之,TypeScript 认为,只要开发者使用了any类型,就表示开发者想要自己来处理这些代码,所以就不对any类型进行任何限制,怎么使用都可以。

从集合论的角度看,any类型可以看成是所有其他类型的全集,包含了一切可能的类型。TypeScript 将这种类型称为“顶层类型”(top type),意为涵盖了所有下层。

类型推断问题

对于开发者没有指定类型、TypeScript 必须自己推断类型的那些变量,如果无法推断出类型,TypeScript 就会认为该变量的类型是any

function add(x, y) {
  return x + y;
}

add(1, [1, 2, 3]) // 不报错

上面示例中,函数add()的参数变量xy,都没有足够的信息,TypeScript 无法推断出它们的类型,就会认为这两个变量和函数返回值的类型都是any。以至于后面就不再对函数add()进行类型检查了,怎么用都可以。

这显然是很糟糕的情况,所以对于那些类型不明显的变量,一定要显式声明类型,防止被推断为any

TypeScript 提供了一个编译选项noImplicitAny,打开该选项,只要推断出any类型就会报错。

$ tsc --noImplicitAny app.ts

上面命令使用了noImplicitAny编译选项进行编译,这时上面的函数add()就会报错。

污染问题

any类型除了关闭类型检查,还有一个很大的问题,就是它会“污染”其他变量。它可以赋值给其他任何类型的变量(因为没有类型检查),导致其他变量出错。

相关文章

  • TypeScript变量的类型(二)

    1. TypeScript类型 - any类型 2. TypeScript类型 - unknown类型 这个代码里...

  • any 和 unknown

    TypeScript 3.0 引入了一个顶级的 unknown 类型。 对照于 any,unknown 是类型安全...

  • typescript中any与unknown的区别

    在typescript中有两种顶级类型(any 与 unknown),那它们两者之间有什么区别呢? 1.任何类型都...

  • TS 中 any 和 unkown 的区别

    unknown 和 any 的主要区别是 unknown 类型会更加严格:在对 unknown 类型的值执行大多数...

  • any 和 unknown

    Top Type 通用父类型(任何类型都可以赋值给这个类型) any unknown 区别 any我不在乎它的类型...

  • TypeScript 里的 unknown 和 never

    unknown 和 any 类似,但前者类型安全。 未知类型代表任何值。 这类似于 any 类型,但更安全,因为使...

  • TypeScript 简洁教程 TS

    TypeScript 基础类型 数据类型关键字描述任意类型any声明为 any 的变量可以赋予任意类型的值数字类型...

  • ES6 之后 typescript 类

    1.0 typescript 类型断言 letsomeValue:any="this is a string";l...

  • typescript--any vs unknow

    any和unknown(ts3.0)一样,所有数据类型都可以分配给any和unknown.但是有区别: any直接...

  • typescript学习记录

    typescript基础 数据类型 null undefined是所有数据类型的子类型 任意值 any 类型推论t...

网友评论

      本文标题:TypeScript 详解之 any 类型,unknown 类型

      本文链接:https://www.haomeiwen.com/subject/issnpdtx.html