JavaScript变成anyScript了

any类型

目录

首先说明一下,本人是前端小学生级别的菜鸡,吐槽的话请口下留情,在评论区指出错误或者补充不足,我会很喜欢,互喷不会进步,相互指点才会。。。。谢谢大家啦

📌使用 any 指包含所有值的顶部类型,所以 any 不进行类型检查,等于关闭了 TS 对该变量的严格类型校验,TypeScript 有两个“顶层类型”(anyunknown

  • 使用 any 类型等同于使用纯 JavaScript 的开发方式,除非你是因为你的项目是旧版本的js
  • 从集合论的角度看,any类型可以看成是所有其他类型的全集,包含了一切可能的类型。TypeScript 将这种类型称为“顶层类型”(top type),意为涵盖了所有下层。
  • 使用 any 类型将失去 typescript 静态类型的强制检测
  • 只有在描述一个根本不知道的类型时使用 any,会造成其他污染

可以将 any 视为所有类型的组合表示

var anyakun: string | boolean | number;
anyakun = "akun";
anyakun = true;
anyakun = 100;

下面是设置基本 any 的示例

let anyakun02: any;
//以下赋值不会报错
anyakun02 = "akun";
anyakun02 = 1999;
anyakun02 = true;
anyakun02 = [];
anyakun02 = {};
anyakun02 = class {};

在数组中使用 any 类型,可以设置任意类型的值

let anyakun03: any[] = ["akun.com", "akun", 2010, true];

也可以使用泛型的方式设置 any 类型数组

let anyakun04: Array<any> = ["akun.com", "akun", 2010, true];

为对象属性设置类型

// 对象
let anyakun05: {
  name: any;
  year: any;
};
//以下设置都不会报错
anyakun05 = { name: "akun", year: 2010 };
anyakun05 = { name: 2010, year: "akun" };

any 太过宽泛所以不建议使用,他会丢失 TS 的严格类型校验,比如下面的示例并不会报错

// //添加或使用不存的属性或者方法
let anyakun06: any;
anyakun06.get(); //不会报错

下面再来看一下对象的使用 any 类型造成的问题

// 示例
class anyakun07 {
  constructor() {}
  get = () => "akun";
}

const obj: any = new anyakun07();
console.log(obj.get()); //akun

所以上例需要指定正确的 akun类型,而不是使用 any

...
const obj:akun = new anyakun07 ;
...

能过设置 tsconfig.json 的 noImplicitAny=true 配置项,可以禁止隐含的 any 类型。以下代码会在编译时报错

$ tsc --noImplicitAny XXX.ts
function sum(a, b) {
  return a + b
}

📌这里有一个特殊情况,即使打开了noImplicitAny,使用letvar命令声明变量,但不赋值也不指定类型,是不会报错的。

//这种没有赋值的情况是不会报错的
var x; // 不报错
let y; // 不报错

上面示例中,变量xy声明时没有赋值,也没有指定类型,TypeScript 会推断它们的类型为any。这时即使打开了noImplicitAny,也不会报错。

let x;

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

上面示例中,变量x的类型推断为any,但是不报错,可以顺利通过编译。

由于这个原因,建议使用letvar声明变量时,如果不赋值,就一定要显式声明类型,否则可能存在安全隐患。

const命令没有这个问题,因为 JavaScript 语言规定const声明变量时,必须同时进行初始化(赋值)。

const x; // 报错

上面示例中,const命令声明的x是不能改变值的,声明时必须同时赋值,否则报错,所以它不存在类型推断为any的问题。

污染问题

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

let x:any = 'hello';
let y:number;

y = x; // 不报错

y * 123 // 不报错
y.toFixed() // 不报错

上面示例中,变量x的类型是any,实际的值是一个字符串。变量y的类型是number,表示这是一个数值变量,但是它被赋值为x,这时并不会报错。然后,变量y继续进行各种数值运算,TypeScript 也检查不出错误,问题就这样留到运行时才会暴露。

污染其他具有正确类型的变量,把错误留到运行时,这就是不宜使用any类型的另一个主要原因。

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值