[TypeScript学习笔记]自定义类型检查
is
关键字
先定义一个类型
type MyType = 'A'| 'B'| 'C'
再定义一个函数,需要传一个MyType
类型的变量
function test(t:MyType) {
// do something
}
接下来正常的业务代码类似这样,但是会报错,因为类型string
不能赋给类型MyType
// 版本1
function run(arg:string) {
// do something
test(arg)
}
所以需要一个类型检查函数
function isMyType(arg:string): boolean {
return ['A', 'B', 'C'].includes(arg);
}
于是业务代码加入判断
// 版本2
function run(arg:string) {
if(!isMyType(arg)) {
throw new Error('arg is invalid')
}
test(arg)
}
但test函数还是会报错,虽然通过上面的类型检查已经确定arg
就是期望的类型了,但是编译器依然认为arg
是string
,于是再修改
// 版本3
function run(arg:string) {
if(!isMyType(arg)) {
throw new Error('arg is invalid')
}
test(arg as MyType)
}
这样写编译不会报错了,逻辑上也是能确保arg
的确是正确的类型,但终究不够《优雅》。联想到下面的代码,通过typeof
类型检查后,编译器就能直接认为arg
是string
类型了
function foo(arg:any) {
if(typeof arg !== 'string') {
throw new Error('arg is invalid')
}
xxx(arg)// 这里编译器就自动认为arg是string
}
因此需要达到类似的效果,可以修改类型检查函数
function isMyType(arg:string): arg is MyType { // 使用is关键字
return ['A', 'B', 'C'].includes(arg);
}
这样这段代码就不会报错了,在自定义类型检查后,编译器也能自动识别为正确的类型
// 版本4
function run(arg:string) {
if(!isMyType(arg)) {
throw new Error('arg is invalid')
}
test(arg)// 这里编译器就自动认为arg是MyType
}