http://www.patrickzhong.com/TypeScript/PREFACE.html

前言

  • TypeScript 官网大约从 2020 年开始要打造新版的官网,其中包括官网的样式,以及要重写大部分的文档。

快速上手

5分钟了解TypeScript

  • 在构造函数的参数上使用public等同于创建了同名的成员变量
class Student {
fullName: string;
constructor(public firstName: string, public middleInitial: string, public lastName: string) {
this.fullName = firstName + " " + middleInitial + " " + lastName;
}
}

Gulp

  • 即使我们使用了ES2015的模块语法,TypeScript还是会生成Node.js使用的CommonJS模块。 我们在这个教程里会一直使用CommonJS模块,但是你可以通过修改module选项来改变这个行为。
  • Babel是个十分灵活的编译器,将ES2015及以上版本的代码转换成ES5和ES3。 你可以添加大量自定义的TypeScript目前不支持的转换器。
  • 设置TypeScript目标为ES2015。 Babel稍后会从TypeScript生成的ES2015代码中生成ES5

React与webpack

  • 通常当你导入像"react"这样的路径,它会查看react包; 然而,并不是所有的包都包含了声明文件,所以TypeScript还会查看@types/react包
  • 可以使用npm link typescript来链接TypeScript到一个全局拷贝,但这不是常见用法
    • 注释:npm link将common模块创建成本地依赖包

从JavaScript迁移到TypeScript

  • 如果你在src目录外还有tests文件夹,那么在src里可以有一个tsconfig.json文件,在tests里还可以有一个。
  • 注释:任意数量参数的定义方法
myCoolFunction(function(x) { console.log(x) }, 1, 2, 3, 4);

function myCoolFunction(f: (x: number) => void, ...nums: number[]): void;
  • TypeScript提供了一些检查来保证安全以及帮助分析你的程序。 当你将代码转换为了TypeScript后,你可以启用这些检查来帮助你获得高度安全性。

    • 在某些情况下TypeScript没法确定某些值的类型。 那么TypeScript会使用any类型代替。

      • 可以使用noImplicitAny选项,让TypeScript标记出发生这种情况的地方,并给出一个错误。
    • 默认地,TypeScript把null和undefined当做属于任何类型。
      • null和undefined经常会导致BUG的产生,所以TypeScript包含了strictNullChecks选项来帮助我们减少对这种情况的担忧
      • 疑问:要当心,当你使用strictNullChecks,你的依赖也需要相应地启用strictNullChecks
    • 当你在类的外部使用this关键字时,它会默认获得any类型
      • TypeScript有noImplicitThis选项。 当设置了它,TypeScript会产生一个错误当没有明确指定类型(或通过类型推断)的this被使用时
      • 解决的方法是在接口或函数上使用指定了类型的this参数:
Point.prototype.distanceFromOrigin = function(this: Point, point: Point) {
return this.getDistance({ x: 0, y: 0});
}

手册

基础类型

  • TypeScript里的所有数字都是浮点数或者大整数 。 这些浮点数的类型是number, 而大整数的类型则是 bigint。 除了支持十进制和十六进制字面量,TypeScript还支持ECMAScript 2015中引入的二进制和八进制字面量。
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
let binaryLiteral: number = 0b1010;
let octalLiteral: number = 0o744;
let bigLiteral: bigint = 100n;
  • 元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。

    • 当访问一个越界的元素会报错
  • 枚举类型提供的一个便利是你可以由枚举的值得到它的名字
enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2]; console.log(colorName); // 显示'Green'因为上面代码里它的值是2
  • 当我们在写应用的时候可能会需要描述一个我们还不知道其类型的变量。这些值可以来自动态内容,例如从用户获得,或者我们想在我们的 API 中接收所有可能类型的值。在这些情况下,我们想要让编译器以及未来的用户知道这个变量可以是任意类型。这个时候我们会对它使用 unknown 类型。

    • 如果你有一个 unknwon 类型的变量,你可以通过进行 typeof 、比较或者更高级的类型检查来将其的类型范围缩小
  • 在对现有代码进行改写的时候,any类型是十分有用的,它允许你在编译时可选择地包含或移除类型检查
    • Object类型的变量只是允许你给它赋任意值 - 但是却不能够在它上面调用任意的方法,即便它真的有这些方法

接口

  • 一些对象属性只能在对象刚刚创建的时候修改其值。 你可以在属性名前用readonly来指定只读属性
interface Point {
readonly x: number;
readonly y: number;
}
  • TypeScript 具有ReadonlyArray<T>类型,它与Array<T>相似,只是把所有可变方法去掉了,因此可以确保数组创建后再也不能被修改
let a: number[] = [1, 2, 3, 4];
let ro: ReadonlyArray<number> = a;
ro[0] = 12; // error!
ro.push(5); // error!
ro.length = 100; // error!
a = ro; // error!
  • 除了描述带有属性的普通对象外,接口也可以描述函数类型。
interface SearchFunc {
(source: string, subString: string): boolean;
}
  • 可以同时使用两种类型的索引,但是数字索引的返回值必须是字符串索引返回值类型的子类型

    • 这是因为当使用number来索引时,JavaScript 会将它转换成string然后再去索引对象
  • 可以将索引签名设置为只读,这样就防止了给索引赋值
interface ReadonlyStringArray {
readonly [index: number]: string;
}
  • 可以在接口中描述一个方法,在类里实现它
interface ClockInterface {
currentTime: Date;
setTime(d: Date): void;
} class Clock implements ClockInterface {
currentTime: Date = new Date();
setTime(d: Date) {
this.currentTime = d;
}
constructor(h: number, m: number) {}
}
  • 类是具有两个类型的:静态部分的类型和实例的类型
  • 当一个类实现了一个接口时,只对其实例部分进行类型检查
interface ClockConstructor {
new (hour: number, minute: number);
} class Clock implements ClockConstructor {
currentTime: Date;
constructor(h: number, m: number) {}
}
  • 一个接口可以继承多个接口,创建出多个接口的合成接口
interface Shape {
color: string;
} interface PenStroke {
penWidth: number;
} interface Square extends Shape, PenStroke {
sideLength: number;
}
  • 一个对象可以同时作为函数和对象使用
interface Counter {
(start: number): string;
interval: number;
reset(): void;
}
  • 当接口继承了一个类类型时,它会继承类的成员但不包括其实现

    • 接口同样会继承到类的 private 和 protected 成员。 这意味着当你创建了一个接口继承了一个拥有私有或受保护的成员的类时,这个接口类型只能被这个类或其子类所实现

函数

  • 书写完整函数类型
let myAdd: (x:number, y:number) => number =
function(x: number, y: number): number { return x + y; };
  • 仅在等式的一侧带有类型,TypeScript编译器仍可正确识别类型

    • 这叫做“按上下文归类”,是类型推论的一种
let myAdd: (baseValue: number, increment: number) => number =
function(x, y) { return x + y; };
  • 与普通可选参数不同的是,带默认值的参数不需要放在必须参数的后面。 如果带默认值的参数出现在必须参数前面,用户必须明确的传入undefined值来获得默认值。
function buildName(firstName = "Will", lastName: string) {
return firstName + " " + lastName;
}
  • 在TypeScript里,你可以把所有参数收集到一个变量里
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}
  • 提供一个显式的this参数。 this参数是个假的参数,它出现在参数列表的最前面
function f(this: void) {
// make sure `this` is unusable in this standalone function
}
  • this: void意味着addClickListener期望onclick是一个函数且它不需要一个this类型。
interface UIElement {
addClickListener(onclick: (this: void, e: Event) => void): void;
}
  • 查找重载列表,尝试使用第一个重载定义。 如果匹配的话就使用这个。 因此,在定义重载的时候,一定要把最精确的定义放在最前面。
  • function pickCard(x): any并不是重载列表的一部分,因此这里只有两个重载:一个是接收对象另一个接收数字
    • 疑问:实现函数需要定义返回类型吗?应该会根据重载自动做出检查吧?
function pickCard(x: {suit: string; card: number; }[]): number;
function pickCard(x: number): {suit: string; card: number; };
function pickCard(x): any {
// 实现
}

字面量类型

  • 目前 TypeScript 中有三种可用的字面量类型集合,分别是:字符串、数字和布尔值

联合类型和交叉类型

  • 使用联合的一种常用技术是使用字面量类型的单个字段,您可以使用该字段来缩小 TypeScript 可能的当前类型
type NetworkLoadingState = {
state: "loading";
}; type NetworkFailedState = {
state: "failed";
code: number;
}; type NetworkSuccessState = {
state: "success";
response: {
title: string;
duration: number;
summary: string;
};
}; // 创建一个只代表上述类型之一的类型,但你还不确定它是哪个。
type NetworkState =
| NetworkLoadingState
| NetworkFailedState
| NetworkSuccessState;
  • 联合的穷尽性检查:编译器能在我们没能覆盖可区分联合的所有变体时告诉我们

  • 类从基类中继承了属性和方法。 这里,Dog是一个_派生类_,它派生自Animal基类,通过extends关键字。 派生类通常被称作_子类_,基类通常被称作_超类_。

typescript 5.1的更多相关文章

  1. TypeScript: Angular 2 的秘密武器(译)

    本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...

  2. TypeScript为Zepto编写LazyLoad插件

    平时项目中使用的全部是jQuery框架,但是对于做webapp来说jQuery太过于庞大,当然你可以选择jQuery 2.*针对移动端的版本. 这里我采用移动端使用率比较多的zepto框架,他跟jqu ...

  3. TypeScript Vs2013 下提示Can not compile modules unless '--module' flag is provided

    VS在开发TypeScript程序时候,如果import了模块有的时候会有如下提示: 这种情况下,只需要对当前TypeScript项目生成设置为AMD规范即可!

  4. TypeScript

    TypeScript: Angular 2 的秘密武器(译)   本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch? ...

  5. 打造TypeScript的Visual Studio Code开发环境

    打造TypeScript的Visual Studio Code开发环境 本文转自:https://zhuanlan.zhihu.com/p/21611724 作者: 2gua TypeScript是由 ...

  6. 转职成为TypeScript程序员的参考手册

    写在前面 作者并没有任何可以作为背书的履历来证明自己写作这份手册的分量. 其内容大都来自于TypeScript官方资料或者搜索引擎获得,期间掺杂少量作者的私见,并会标明. 大部分内容来自于http:/ ...

  7. Webstorm编译TypeScript

    下载webstorm 下载node.js编译器npm   Webstorm的安装很简单.但如果没有Java For Mac 环境打开Webstorm时会有提示,点击提示会跳转下载链接,下载安装就好. ...

  8. CSS3与页面布局学习总结(七)——前端预处理技术(Less、Sass、CoffeeScript、TypeScript)

    CSS不像其它高级语言一样支持算术运算.变量.流程控制与面向对象特性,所以CSS样式较多时会引起一些问题,如修改复杂,冗余,某些别的语言很简单的功能实现不了等.而javascript则是一种半面向对象 ...

  9. 使用TypeScript拓展你自己的VS Code!

    0x00 前言 在前几天的美国纽约,微软举行了Connect(); //2015大会.通过这次大会,我们可以很高兴的看到微软的确变得更加开放也更加务实了.当然,会上放出了不少新产品和新功能,其中就包括 ...

  10. 产品前端重构(TypeScript、MVC框架设计)

    最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的, ...

随机推荐

  1. django 如何查询汇总的求和时避免没有数据导致的错误

    django 如何查询汇总的求和时避免没有数据导致的错误 在 Django 中,如果你希望对某个字段进行求和操作,并在没有数据时返回默认值,可以使用 aggregate 结合 Coalesce 函数. ...

  2. 第四节 JMeter基础-初级登录【固定用户登录】

    声明:本文所记录的仅本次操作学习到的知识点,其中商城IP错误,请自行更改. 1.认识JMeter (1)测试计划:测试的起点,所有组件的容器.相当于一个测试项目,对测试计划展开一系列的操作. (2)线 ...

  3. 跟着ChatGPT学习设计模式 - 工厂模式

    1. 前言 在工作过程中,越发觉得设计模式的重要性.经常会有人说工作5年的人,大学生随便培训1-2月也能做同样的工作,没错,大学生的确可以做. 但其写的代码,可维护性.可扩展性.添加新功能时方便还是简 ...

  4. 安卓网络通信之 ​HttpURLConnection​ 文件上传

    文件上传分为二步,第一步选择文件 代码思路是: chooseFile()​方法用于创建一个Intent对象,并设置Intent的Action为ACTION_GET_CONTENT,这表示获取内容,即选 ...

  5. java8interface的新特性:default,static,funcation

    default:默认方法 在类接口中可以直接定义的方法,实现接口的类可以直接使用 使用案例: public interface MyInterface { default void display() ...

  6. neo4j常用命令练习

    查询 查询node labels下的节点 match (n:`企业`) return n 查询单个节点,这里返回的是一个节点,具有以下两种写法:在java中是optional,需要get一下 matc ...

  7. RDD入门了解

    RDD即resilient distributed dataset 弹性分布式数据集,简单来说就是数据集,可以类比python的list dict:但是数据是分布式存储的,可用于分布式计算:可以存在内 ...

  8. 智能家居如何把老款定频空调变成智能“变频”空调#米家#智能家居#HA

    背景 最近长沙的天气暴热,室内达到了34-35度,天气预报最高温度上了40度,这么酷热的天气,离开了空调,基本上就是一身汗,全身湿透,特别难受,然后不得不开启家里的一台将近10年的老式定频空调,输入功 ...

  9. Java---杂记

    1. 当System.out.println()方法的参数是Object类型时,println()方法会自动调用Object对象的toString()方法,然后显示toString()方法返回的字符串 ...

  10. 信奥生(OIER)请看,包囊初赛复赛全真模拟赛!

    luogu 动态追踪! 唠唠嗑 感谢 tyw 代理团主对比赛的贡献,但是由于我和 tyw 的关系紧张,tyw 取消了我和她的一切合作.CTFPC-3rd 的出题.宣传工作都交到了我手上,我这次亚历山大 ...