介绍
各位老铁上午好,昨天我们学习了TypeScript中的类型断言(as操作符),今天我们来学习TypeScript中的类型谓词(Type Predicate)(is操作符)。
为什么需要类型谓词呢?我们先看一个例子,假设我们要写一个函数,判断一个变量是否为字符串类型。
1 | function isString(value: unknown): boolean { |
调用这个函数
1 | function example(foo: any) { |
看起来一切正常,但是假如我们疏忽了,不小心在example
中调用了一个不属于字符串的方法,比如toFixed
,TypeScript会报错,因为字符串上没有toFixed
方法。
1 | function example(foo: any) { |
在上面的代码中,虽然满足了isString()
的判断,但是在编译期间,foo还是它本来的类型,typescript无法在编译期检查到错误。
但是,如果我们加上类型谓词,IDE就会提示字符串上没有toFixed
方法。也就是说,类型谓词可以在编译时就杜绝类型错误,这就是它核心的功能。
1 | function isString(value: unknown): value is string { |
上面的代码中,typescript在编译期就会将value的类型窄化为string
,如果调用的方法不属于string
类型,IDE会提示错误。
1 | function example(foo: any) { |
类型谓词的语法规则
类型谓词要写在函数的返回值上,形式为:value is Type
,其中value
是函数的参数,Type
是要判断的类型,比如一个判断number
类型的函数可以这样写:
1 | function isNumber(value: unknown): value is number { |
类型谓词的作用范围
需要注意的是,类型谓词只在isString
函数的作用域内有效。也就是说,只有在isString
函数返回true
的情况下,TypeScript才会将传入的参数类型窄化为string
。
1 | function example(foo: any) { |
好了,今天就到这里了,我们明天见。
今天又买了一把新弹弓:锁凤十代,握感舒适,重量适中。理查德说这个弓可以留着,我再试两天再说。