今天要来了解 any
和 unknow
,这两个会放在一起说明是因为性质和用法很相似,但却有些许不一样,稍後比较後,就可以明白为什麽了?
在 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 意义,这样编写出来的程序码会暴露在不安全的情况下,所以我们能尽量能不用就不用。
可以说是安全版的 any
,究竟是为什麽呢?
unknown
和 any
共通点:可以接受任何型别赋值。
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: 为型别检测,我们在进行型别判断时常会用到的 typeof
、 instanceof
都是。
简单复习 any
和 unknown
差异
相同:可以接受任意型别。
不同:any
可以进行任意属性或方法操作,unknown
则是要透过型别检测限缩之後才可以。
今天简单了解 any
& unknown
,明天让我们继续努力进步。
>>: #16-载入炫起来!水滴状Loading特效(SVG filter)
Action 类似於mutation action -> mutation ->...
这个得上一篇:https://ithelp.ithome.com.tw/articles/10258...
倒数第二篇~ 来个不分类的杂七杂八问题篇, 有些问题,不知道该怎麽分类, 而有些分类,这次没机会写到...
陆、第五章 领导统御 成功的ISMS是由上而下实行的,透过考虑利害关系者的要求及采取有效控制措施将营...
学习完 git 的基本观念後,我们就来进入下一阶段,创建分支吧! 为什麽会需要分支呢? 分支的好处在...