``` 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(''); } } ```
实际上文档里面说的重点在于静态类型推导这一问题,在函数 padLeft 里,padding 是 string 或者 number 类型,如果 typescript 没有足够的智能识别变量的类型,比如它即便通过了 if(typeof padding === "number"),它仍旧认为 padding 是 string|number 类型,那么 Array(padding + 1).join(" ") + value 就会有问题。所以需要通过 x is number 来将 padding 转化成 number,但 typescript 足够智能,所以不会有这问题。
maichael
2018-10-22 14:47:48 +08:00
在 typescript 里面,typeof 分成两种情况,取决于值的用途。 1. 作为变量使用,比如 const t = typeof A 2. 作为类型使用,比如 type t = typeof A 第一个和普通的 javascript 的 typeof 没有任何区别,第二个是 typescript 里的类型。
kingwl
2018-10-22 14:57:40 +08:00
其实是两个部分 1. type narrow (比如 typeof xxx === 'number' 和其他一大堆情况 ) 就是做类型推断 2. type predicate (比如 xxx is Type) 这个是允许一些你 type narrow 不过去的情况下, 自己断言一些类型