快速入门TypeScript

都2021年了,TypeScript已经成为大厂React应用的标配,也成为前端程序员的必备技能之一。
Vue也完全支持了TypeScript,基本所有用流行框架搭建的应用都可以使用TypeScript。
本文将从TypeScript是什么TypeScript的作用与优势如何学习TypeScript三个角度帮助大家入门TypeScript。(以下简称ts)


TypeScript是什么

TypeScript extends JavaScript by adding types.

  • ts通过增加类型,来扩展js
  • 换句话说,ts是js类型的超集
  • ts最终也是编译成js来运行
  • ts由微软于2012年10月发布,此后越来越流行

我的理解:ts不是一门新的语言,而是基于js的一种新语法糖

TypeScript的作用与优势

By understanding JavaScript, TypeScript saves you time catching errors and providing fixes before you run code.
Any browser, any OS, anywhere JavaScript runs. Entirely Open Source.

  • 通过理解js,在运行代码前,ts节省了你用来捕获错误、修复类型错误的时间
  • 任何浏览器、任何操作系统、任何可以运行js的地方,都可以运行ts
  • 完全开源

我的理解:
1. ts最主要的作用就是静态类型检查,规避js弱类型的弊端,在开发阶段就避免因类型原因导致的bug
2. 对于其他语言(如java)转到前端的开发人员友好,ts的语法糖参考了许多面向对象语言的语法
3. 清晰的类型定义与代码结构,使后期维护更为便利
4. TypeScript已经相对成熟了,网上的资料也很齐全,大部分的库、框架以及IDE都对TypeScript做了很好支持

ts对类型的检查

如何学习TypeScript

学习一门新技术,最好的方法,一定是结合官网,边阅读边实践。
Ts官网分英文官网中文官网,建议阅读英文官网,原因:

  1. 中文官网更新不及时,英文官网已经更新Ts 4.1版本了,中文的才3.1
  2. 中文官网充满了广告 (# ̄~ ̄#)
  3. 英文官网版权到2021年,中文官网才到2018年,已经过期了,似乎已经很久没维护了。。

本文的目的是帮助新手快速入门ts,对其有概念后,再通过自己在项目中运用来进行深入。

安装与编译

安装(任选一种)
  1. npm install -g typescript
  2. 在支持ts的IDE(如vscode)上安装ts插件
编译

ts文件以.ts为后缀,可通过tsc指令将ts文件编译成js文件:
tsc greeter.ts

再来介绍几个最常用的基本概念:基本类型、接口、泛型、类

基本类型

众所周知,js有6种数据类型:数字(number)、字符串(string)、布尔值(boolean)、undefined、null、对象(Object)
但是,js是弱类型语言,定义变量时是某种类型,其后也可以对其类型进行随意更改,并且例如if()等语法会对变量进行隐式转换,这些操作极易引发预期之外的错误,在其他面向对象语言中也是绝对不被允许的。
ts对变量类型进行了强定义与扩展,在定义或引用之初就特定类型:

// 1. 布尔值
let isDone: boolean = false;
// 2. 数字
let decLiteral: number = 6;
// 3. 字符串
let name: string = "bob";
// 4. 数组:成员相同类型
let list: number[] = [1, 2, 3];
// 5. 元祖:成员不同类型
let x: [string, number];
// 6. 枚举:适用于映射关系、关联常量
enum Color { Red = 1, Green = 2, Blue = 4 }
let c: Color = Color.Green;
// 7. Any:适用未知类型变量,定义之后可以改变类型,尽量少用
let notSure: any = 4;
// 8. Void:适用函数无返回值
function warnUser(): void {
    console.log("This is my warning message");
}
// 9. Null 和 Undefined
let u: undefined = undefined;
let n: null = null;
// 10. Never
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
    throw new Error(message);
}
// 11. Object
declare function create(o: object | null): void;

create({ prop: 0 }); // OK
create(null); // OK
类型断言

当开发人员比ts更清楚某个值的类型,且该场景下必须为该类型,可使用类型断言:

// 二者等价
let strLength: number = (<string>someValue).length;
let strLength: number = (someValue as string).length;

接口

将复杂结构的数据类型抽离出来,定义成一个单独的数据,这就是接口,关键字interface
将接口单独抽离,可使代码结构更加清晰,且便于复用。

// ?代表可选参数,其余为必选
interface SquareConfig {
  color: string;
  width?: number;
}

一般可以在项目src或者每个模块下新建types目录,用于存放该模块下所有接口:

src
|- types
|   |- index.d.ts
|   |- data.d.ts
|- components

泛型

  • 泛型是新手比较难理解和使用的概念。
  • 它的作用是,使组件能支持未来的数据类型,即当前不能确定是何类型,未来确定类型后,能灵活使用该类型。
  • 适用大型系统中的复杂不确定场景。
  • 在C#和Java中,都可以使用泛型来创建可重用的组件。
function identity<T>(arg: T): T {
    return arg;
}

上例中,arg为不确定类型的参数,若函数中或返回值需要使用该参数类型,则可用泛型T来代替并直接使用。

后端同学或使用过其他面向对象语言的同学会对这个概念比较熟悉,因为类在这些语言中是已存在的基本概念,即基于类的继承并且对象是由类构建出来的。
实际上,ES6已经将类的概念纳入到了js基本语法中,大家可以放心使用。

类的写法
// 该类包括greeting属性、构造函数、greet方法
// this代表该构造函数本身
// greeter为该类的实例对象
class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

let greeter = new Greeter("world");
继承
// 通过extends关键字,子类Dog从基类Animal中继承了属性与方法
class Animal {
    move(distanceInMeters: number = 0) {
        console.log(`Animal moved ${distanceInMeters}m.`);
    }
}

class Dog extends Animal {
    bark() {
        console.log('Woof! Woof!');
    }
}

const dog = new Dog();
dog.bark();
dog.move(10);
dog.bark();
公共,私有与受保护的修饰符
// public-自由访问
// private-只能在声明类中访问
// protected-只能在声明类和子类中访问
// 若不加修饰符  默认为public
class Animal {
    public name: string;
    private age: number;
    protected gender: string;
    public constructor(theName: string) { this.name = theName; }
    public move(distanceInMeters: number) {
        console.log(`${this.name} moved ${distanceInMeters}m.`);
    }
}
readonly修饰符
// 只读属性,无法修改
// 必须在声明时或构造函数里被初始化
class Octopus {
    readonly name: string;
    readonly numberOfLegs: number = 8;
    constructor (theName: string) {
        this.name = theName;
    }
}
let dad = new Octopus("Man with the 8 strong legs");
dad.name = "Man with the 3-piece suit"; // 错误! name 是只读的.

结语

以上为TypeScript中最常用的概念,本文以最简单的例子进行论述,目的是让读者快速入门。
看完后对ts有了基本认识,已经可以在项目中使用起来了。
之后的进阶与深入,请结合官网,在实践中获得真理!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容