资讯详情

【TS】1307- TypeScript 你还只会用 any?

https://space.bilibili.com/406258607

文末可扫码观看(已更多) 8 期)

在你刚学 TypeScript 是不是遇到了很多疯狂的问题,最后用了? any 大招解决了问题。如果以后没有系统的学习 TypeScript 你会发现你可,你会发现你可能会把它拿走 TypeScript 学成了 AnyScript。

582ec13ec30700ca8444ed4879785c1b.gif

在 TypeScript 中,any 类型被称为 top type。所谓的 top type 可以理解为一般父类型,即可以包含所有值的类型。

letvalue:any;  value=true;//OK value=42;//OK value="HelloWorld";//OK value=[];//OK value={};//OK value=Math.random;//OK value=null;//OK value=undefined;//OK value=newTypeError();//OK value=Symbol("type");//OK

而在 TypeScript 3.0 又引入了一个新的 top type —— unknown 类型。同样,你也可以给任何值 unknown 类型变量。

letvalue:unknown;  value=true;//OK value=42;//OK value="HelloWorld";//OK value=[];//OK value={};//OK value=Math.random;//OK value=null;//OK value=undefined;//OK value=newTypeError();//OK value=Symbol("type");//OK

现在问题来了,any 类型和 unknown 类型有什么区别?

其实 any 类型本质上是类型系统的逃生舱口,

letvalue:any;  value.foo.bar;//OK value.trim();//OK value();//OK newvalue();//OK value[0][1];//OK

这会带来什么问题?让我们举一个例子:

functioninvokeCallback(callback:any){ try{ callback(); }catch(err){ console.error(err) } }  invokeCallback(1);

对于以上的 TS 编译期间代码不会提示任何错误,但运行期间会抛出错误。

为了解决 any 安全隐患类型存在,TypeScript 团队在 3.0 引入版本 你可以把它理解为类型

那么 unknown 类型安全体现在哪里?在这里,我们将 invokeCallback 函数参数的类型改为 unknown 类型,之后 TS 编译器将提示相应的错误信息:

functioninvokeCallback(callback:unknown){ try{ //Objectisoftype'unknown'.(2571) callback();//Error }catch(err){ console.error(err) } }  invokeCallback(1);

相比 any 类型,TypeScript 会对 unknown 类型变量执行类型检查,避免发生 callback 参数非函数类型。为了解决上述问题,我们需要减少 callback 参数的类型可以通过 typeof 操作符确保输入 callback 参数是函数类型的对象:

functioninvokeCallback(callback:unknown){ try{ if(typeofcallback==='function'){ callback(); } }catch(err){ console.error(err) } }  invokeCallback(1);

在实际工作中,你也可以通过 instanceof 或者用户定制类型守卫来缩小变量类型。

declarefunctionisFunction(x:unknown):xisFunction;  functionf20(x:unknown){ if(xinstanceofError){ x;//Error } if(isFunction(x)){ x;//Function } }

与 any 因为 TypeScript 会对 unknown 类型变量执行类型检查,所以当我们在以前的代码中检查时 value 变量的类改成 unknown 类型时,使用 value 变量的多个语句将出现错误。

let value: unknown;

// Object is of type 'unknown'.(2571)
value.foo.bar; // Error
value.trim(); // Error
value(); // Error
new value(); // Error
value[0][1]; // Error

另外,需要注意的是,unknown 类型的变量只能赋值给 any 类型和 unknown 类型本身。

let value: unknown;

let value1: unknown = value; // OK
let value2: any = value; // OK
let value3: boolean = value; // Error
let value4: number = value; // Error
let value5: string = value; // Error
let value6: object = value; // Error
let value7: any[] = value; // Error
let value8: Function = value; // Error

在往期视频中我们已经介绍过了 keyof 操作符和映射类型。

any 类型和 unknown 类型在这些场合中的表现也是不一样的:

type T40 = keyof any;  // string | number | symbol
type T41 = keyof unknown;  // never

type T50<T> = { [P in keyof T]: number };
type T51 = T50<any>;  // { [x: string]: number }
type T52 = T50<unknown>;  // {}

在以上代码中,T50 类型被称为映射类型,在映射过程中,如果 key 的类型是 never 类型,则当前 key 将会被过滤掉,所以 T52 的类型是空对象类型。

关于 any 类型和 unknown 类型的区别就介绍到这里,现在我们来做个总结:

  • 你可以把任何值赋给 any 类型的变量,并对该变量执行任何操作;

  • 你可以把任何值赋给 unknown 类型的变量,但你必须进行类型检查或类型断言才能对变量进行操作;

在平时工作中,为了保证类型安全,我们应该尽可能使用 类型。最后我们来看一下 unknown 类型与不同类型进行类型运算的结果:

// In an intersection everything absorbs unknown
type T00 = unknown & null;  // null
type T01 = unknown & undefined;  // undefined
type T02 = unknown & null & undefined;  // null & undefined (which becomes never in union)
type T03 = unknown & string;  // string
type T04 = unknown & string[];  // string[]
type T05 = unknown & unknown;  // unknown
type T06 = unknown & any;  // any

// In a union an unknown absorbs everything
type T10 = unknown | null;  // unknown
type T11 = unknown | undefined;  // unknown
type T12 = unknown | null | undefined;  // unknown
type T13 = unknown | string;  // unknown
type T14 = unknown | string[];  // unknown
type T15 = unknown | unknown;  // unknown
type T16 = unknown | any;  // any

any 类型比较特殊,该类型与任意类型进行交叉或联合运算时,都会返回 any 类型。

阅读完本文之后,相信你已经了解 any 类型和 unknown 类型之间的区别了。如果知道的话,可以在评论区提交你的答案。你喜欢以这种形式学 TS 么?喜欢的话,记得点赞与收藏哟。

扫码查看  系列视频教程

(目前已更新期)

标签: t40fm扭矩传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司