简介及安装
JavaScript是一门动态弱类型语言。对变量的类型非常宽容,没有类型约束。
TS是一个拥有类型系统的JavaScript超集,可以编译成纯JavaScript。
ts主要提供了类型系统和对ES6的支持。
tsconfig.json目录中文件的存在表明该目录是ts项目的根。该tsconfig.json文件指定了根文件和编译项目所需的编译器选项。
有node环境,通过npm安装:
安装:
npm i -g typescript
检查ts版本:
tsc -v
强类型语言
强类型语言和弱类型语言
- 强类型语言:不允许改变变量的数据类型,除非进行强制类型转换。
- 弱类型语言:变量可以被赋予不同的数据类型。
动态类型语言和静态类型语言 - 静态类型语言:在编译阶段确定所有变量的类型。
- 动态类型语言:在执行阶段确定所有变量的类型。
静态类型与动态类型对比:
静态类型语言 | 动态类型语言 |
---|---|
对类型极度严格 | 对类型非常宽松 |
立即发现错误 | Bug可能隐藏数月甚至数年 |
运行时性能好 | 运行时性能差 |
自文档话 | 可读性差 |
动态类型语言的支持者认为:
- 性能是可以改善的(V8引擎),而语言的灵活性更重要
- 隐藏的错误可以通过单元测试发现
- 文档可以通过工具生成
强类型语言:不允许程序在发生错误后继续执行。
总结:ts是一门强类型静态类型语言。
三个要点
三个要点:
• 类型检查
TS会在编译代码时,进行严格的静态类型检查。
• 语言扩展
异步操作、装饰器、接口类型、抽象类。
• 工具属性
TS可以编译成标准的JavaScript。
类型检测!!
类型引发的问题 首先需要知道,编程开发中我们有一个共识:错误出现的越早越好
能在写代码的时候发现错误,就不要在代码编译时再发现(IDE的优势就是在代码编写过程中帮助我们发现错误)
能在代码编译期间发现错误,就不要在代码运行期间再发现(类型检测就可以很好的帮助我们做到这一点)
能在开发阶段发现错误,就不要在测试期间发现错误,能在测试期间发现错误,就不要在上线后发现错误
类型思维的缺失
前端开发人员通常不关心变量或者参数是什么类型的,如果在必须确定类型时,我们往往需要使用各种判断验证
经常会说JavaScript不适合开发大型项目,因为当项目一旦庞大起来,这种宽松的类型约束会带来非常多的安全隐患,多人员开发它们之间也没有良好的类型契约
标题TypeScript 4.1新特性
• 字符串模板类型
字符串模板中的联合类型会被展开后排列组合:
type T3 = `${'top' | 'bottom'}-${'left' | 'right'}`;
// 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'
• 新增关键字
• uppercase
• lowercase
• capitalize
• uncapitalize
大写、小写、首字母大写、首字母小写
type Cases<T extends string> = `${uppercase T} ${lowercase T} ${capitalize T} ${uncapitalize T}`;
type T11 = Cases<'bar'>; // 'BAR bar Bar bar'
• 配合infer
模板字符串可以通过infer关键字,实现类似于正则匹配提取的功能:
type MatchPair<S extends string> = S extends `[${infer A},${infer B}]` ? [A, B] : unknown;
type T20 = MatchPair<'[1,2]'>; // ['1', '2']
type T21 = MatchPair<'[foo,bar]'>; // ['foo', 'bar']
通过 , 分割左右两边,再在左右两边分别用一个 infer 泛型接受推断值 [ i n f e r A , {infer A}, inferA,{infer
B}],就可以轻松的重新组合 , 两边的字符串。 配合 … 拓展运算符和 infer递归,甚至可以实现 Join 功能:
type Join<T extends (string | number | boolean | bigint)[], D extends string> =
T extends [] ? '' :
T extends [unknown] ? `${T[0]}` :
T extends [unknown, ...infer U] ? `${T[0]}${D}${Join<U, D>}` :
string;
type T30 = Join<[1, 2, 3, 4], '.'>; // '1.2.3.4'
type T31 = Join<['foo', 'bar', 'baz'], '-'>; // 'foo-bar-baz'
Here is yuque doc card, click on the link to view:https://www.yuque.com/go/doc/11274721