TypeScript 类型系统简述 思考题:有人说 TypeScript = Type + Javascript,那么抛开 Javascript 不谈,这里的 Type 是一门完备的编程语言吗? TypeScript 的类型是支持定义 "函数定义" 的 有过编程经验的同学都知道,函数是一门编程语言中最基础的功能之一,函数是过程化、面向对象、函数式编程中程序封装的基本单元,其重要程度不言而喻。
函数可以帮助我们做很多事,比如 :
函数可以把程序封装成一个个功能,并形成函数内部的变量作用域,通过静态变量保存函数状态,通过返回值返回结果。 函数可以帮助我们实现过程的复用,如果一段逻辑可以被使用多次,就封装成函数,被其它过程多次调用。 函数也可以帮我们更好地组织代码结构,帮助我们更好地维护代码。 那么言归正传,如何在 TypeScript 类型系统中定义函数呢? TypeScript 中类型系统中的的函数被称作 泛型操作符,其定义的简单的方式就是使用 type 关键字:
// 这里我们就定义了一个最简单的泛型操作符 type foo = T; 这里的代码如何理解呢,其实这里我把代码转换成大家最熟悉的 Javascript 代码其实就不难理解了:
// 把上面的类型代码转换成 JavaScript 代码
function foo(T) {
return T
}
那么看到这里有同学心里要犯嘀咕了,心想你这不是忽悠我嘛?这不就是 TypeScript 中定义类型的方式嘛?这玩意儿我可太熟了,这玩意儿不就和 interface 一样的嘛,我还知道 Type 关键字和 interface 关键字有啥细微的区别呢!
嗯,同学你说的太对了,不过你不要着急,接着听我说,其实类型系统中的函数还支持对入参的约束。
// 这里我们就对入参 T 进行了类型约束 type foo = T; 那么把这里的代码转换成我们常见的 TypeScript 是什么样子的呢?
function foo(T: string) { return T } 当然啦我们也可以给它设置默认值:
// 这里我们就对入参 T 增加了默认值 type foo = T; 那么这里的代码转换成我们常见的 TypeScript 就是这样的: function foo(T: string = 'hello world') { return T } 看到这里肯定有同学迫不及待地想要提问了:那能不能像 JS 里的函数一样支持剩余参数呢?
很遗憾,目前暂时是不支持的,但是在我们日常开发中一定是有这样的需求存在的。那就真的没有办法了嘛?其实也不一定,我们可以通过一些骚操作来模拟这种场景,当然这个是后话了,这里就不作拓展了。
TypeScript 的类型是支持 "条件判断" 的 人生总会面临很多选择,编程也是一样。 ——我瞎编的 条件判断也是编程语言中最基础的功能之一,也是我们日常撸码过程成最常用的功能,无论是 if else 还是 三元运算符,相信大家都有使用过。
那么在 TypeScript 类型系统中的类型判断要怎么实现呢? 其实这在 TypeScript 官方文档被称为 条件类型(Conditional Types),定义的方法也非常简单,就是使用 extends 关键字。
T extends U ? X : Y;