TypeScript 能手养成之旅 Day 14 特殊型别(2) - Any & Unknown

前言

今天要来了解 anyunknow ,这两个会放在一起说明是因为性质和用法很相似,但却有些许不一样,稍後比较後,就可以明白为什麽了?

任意型别(Any)

在 TypeScript 的众多型别里面,any 是一个非常特殊的存在,一般我们型别注记後,Typecript 都会进行型别检查,唯独 any 会跳过检查,会想这是开外挂还是走後门?所以 any 可以相容所有的型别(包括 any 本身)。

型别推论

当我们宣告一个变数不注记型别,TypeScript 就会推论为 any

any 可以赋值任何型别

let cy: any;

cy = [];               // 阵列,pass
cy = {};               // 物件,pass
cy = null;             // null,pass
cy = undefined;        // undefined,pass
cy = true;             // 布林,pass
cy = 18;               // 数字,pass
cy = "Hello TypeScript"; // 字串,pass
cy = new TypeError();  // Error物件,pass

就因为视为任意型别,所以任意使用各种型别属性和方法操作,都不会有错误,如下:

let cy: any;

cy();       // 函式呼叫,pass
new cy();   // 建立物件,pass
cy[0];      // 取阵列元素,pass
cy.length;  // 字串长度,pass
cy.toUpperCase();  // 把字串转大写,pass

就以上我们发现,完全毫无使用 TypeScript 意义,这样编写出来的程序码会暴露在不安全的情况下,所以我们能尽量能不用就不用。

未知型别(unknown)

可以说是安全版的 any,究竟是为什麽呢?

unknownany 共通点:可以接受任何型别赋值。

let cy: unknown;

cy = [];               // 阵列,pass
cy = {};               // 物件,pass
cy = null;             // null,pass
cy = undefined;        // undefined,pass
cy = true;             // 布林,pass
cy = 18;               // 数字,pass
cy = "Hello TypeScript"; // 字串,pass
cy = new TypeError();  // Error物件,pass

那属性和方法的操作呢?

let cy: unknown;

cy();       // 函式呼叫,喷错
new cy();   // 建立物件,喷错
cy[0];      // 取阵列元素,喷错
cy.length;  // 字串长度,喷错
cy.toUpperCase();  // 把字串转大写,喷错

虽说似乎比 any 安全一点,不过好像什麽事也都不能做。

let isUnknown: unknown;

let cy: string = isUnknown; //Error: Type 'unknown' is not assignable to type 'number'

如果我们要在 unknown 型别下进行属性或方法操作,透过 Type Guards 进行限缩确切跟 TypeScript 说明目前是何种型别才可以,如下:

let isUnknown: unknown;

if (typeof isUnknown === 'string') {
  let cy: string = isUnknown;
  cy.length
}

注解:

Type Guards: 为型别检测,我们在进行型别判断时常会用到的 typeofinstanceof都是。

结语

简单复习 anyunknown 差异

相同:可以接受任意型别。

不同:any 可以进行任意属性或方法操作,unknown 则是要透过型别检测限缩之後才可以。

今天简单了解 any & unknown ,明天让我们继续努力进步。


<<:  Day 16 - 不小心断赛之 Lifecycle

>>:  #16-载入炫起来!水滴状Loading特效(SVG filter)

[30天 Vue学好学满 DAY21] Vuex-4

Action 类似於mutation      action -> mutation ->...

第42天~

这个得上一篇:https://ithelp.ithome.com.tw/articles/10258...

杂七杂八问题篇

倒数第二篇~ 来个不分类的杂七杂八问题篇, 有些问题,不知道该怎麽分类, 而有些分类,这次没机会写到...

ISO 27001 资讯安全管理系统 【解析】( 十三)

陆、第五章 领导统御 成功的ISMS是由上而下实行的,透过考虑利害关系者的要求及采取有效控制措施将营...

Day19|【Git】开始使用分支 - git branch(基本常用指令)

学习完 git 的基本观念後,我们就来进入下一阶段,创建分支吧! 为什麽会需要分支呢? 分支的好处在...