typeof 和 instanceof 为何需要写在函数里面呢
1
caopi OP 官方文档里将 typeof x === "number"抽象成一个函数,后面又说不必将他抽象成函数??
|
2
caopi OP typescript 里面的 typeof 和 js 里面有什么区别吗
|
3
ltoddy 2018-10-22 14:31:48 +08:00
首先啊, typescript 是强类型的, 也就是每个变量他的类型是知道的, 或者你声明变量的类型, 或者通过 typescript 的类型推导, 每个变量有明确的类型, 那么类型你都知道, typeof 一个变量不就是有毛病嘛.
借用官网教程的一段代码: ``` function reverse(x: number): number; function reverse(x: string): string; function reverse(x: number | string): number | string { if (typeof x === 'number') { return Number(x.toString().split('').reverse().join('')); } else if (typeof x === 'string') { return x.split('').reverse().join(''); } } ``` 这里用了 typeof, 是为了函数重载. |
5
maichael 2018-10-22 14:43:14 +08:00 1
实际上文档里面说的重点在于静态类型推导这一问题,在函数 padLeft 里,padding 是 string 或者 number 类型,如果 typescript 没有足够的智能识别变量的类型,比如它即便通过了 if(typeof padding === "number"),它仍旧认为 padding 是 string|number 类型,那么 Array(padding + 1).join(" ") + value 就会有问题。所以需要通过 x is number 来将 padding 转化成 number,但 typescript 足够智能,所以不会有这问题。
|
6
maichael 2018-10-22 14:47:48 +08:00
在 typescript 里面,typeof 分成两种情况,取决于值的用途。
1. 作为变量使用,比如 const t = typeof A 2. 作为类型使用,比如 type t = typeof A 第一个和普通的 javascript 的 typeof 没有任何区别,第二个是 typescript 里的类型。 |
7
kingwl 2018-10-22 14:57:40 +08:00
其实是两个部分
1. type narrow (比如 typeof xxx === 'number' 和其他一大堆情况 ) 就是做类型推断 2. type predicate (比如 xxx is Type) 这个是允许一些你 type narrow 不过去的情况下, 自己断言一些类型 |