TypeScript | 青训营笔记

144 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第2天

进入ts之前,先浅浅说一下js的弊病

JavaScript弊病

弊病一

顶层对象,在浏览器环境指的是window对象,在 Node 指的是global对象。ES5 之中,顶层对象的属性与全局变量是等价的。

window.a = 1;
a // 1

a = 2;
window.a // 2

上面代码中,顶层对象的属性赋值与全局变量的赋值,是同一件事。

顶层对象的属性与全局变量挂钩,被认为是 JavaScript 语言最大的设计败笔之一。

这样的设计带来了几个很大的问题,首先是没法在编译时就报出变量未声明的错误,只有运行时才能知道(因为全局变量可能是顶层对象的属性创造的,而属性的创造是动态的);其次,程序员很容易不知不觉地就创建了全局变量(比如打字出错);最后,顶层对象的属性是到处可以读写的,这非常不利于模块化编程。另一方面,window对象有实体含义,指的是浏览器的窗口对象,顶层对象是一个有实体含义的对象,也是不合适的。----引用自《ECMAScript 6 入门

弊病二

typeof null === 'object'

null作为一个基本数据类型为什么会被typeof运算符识别为object类型呢? 这是因为javascript中不同对象在底层都表示为二进制,而javascript 中会把二进制前三位都为0的判断为object类型,而null的二进制表示全都是0,自然前三位也是0,所以执行typeof时会返回'object。----引用自《你不知道的javascript(上卷)》

这里只列举两项了,更多详细信息详见《JavaScript 的设计失误(历史、现状以及未来)》(developer.aliyun.com/article/644…

TypeScript

简称 ts,是微软开发的一种静态的编程语言,它是 JavaScript 的超集。 那么它有什么特别之处呢?

  1. 简单来说,js 有的 ts 都有,所有js 代码都可以在 ts 里面运行。
  2. ts 支持类型支持,ts = type +JavaScript。

那么 ts 和 js 有什么区别呢?

  1. JavaScript 属于动态编程语言,而ts 属于静态编程语言。

    • js:边解释边执行,错误只有在运行的时候才能发现
    • ts:先编译再执行,在写的时候就会发现错误了(ts不能直接执行,需要先编译成 js )
  2. ts 完全支持 js ,可以直接转换 在这里插入图片描述

  3. ts 有类型支持,有强大的代码类型提示

TypeScript基础语法

基础数据类型

//字符串
const q : string = 'string';
//数字
const w : number = 1;
//布尔值
const e : boolean = true;
//null
const r : null = null;
//undefined
const t : undefined = undefined;

对象类型

//interface接口属性 只能为对象指定类型。它可以继承。
interface IBytedancer {  //用 I 开始表示该变量名是某个类型  
    // 只读属性: 约束属性不可在对象初始化外赋值
    readonly id : number,
    name: string,
    //只能定义值为 man 或者 wj
    sex: 'man' | 'woman' | 'other',
    age : number,
    // 可选属性:定义该属性可以不存在
    hobby?: string,
    // 任意属性:约束所有对象属性都必须是该属性的子类型
    [key:string] : any,
    //当类型设置为any时,就取消了类型限制,一般不推荐
}

const bytedancer : IBytedancer = {
    id : 194432,
    name : 'Liu',
    sex : 'man',
    age : 21,
    hobby : 'basketball',
}

//报错:无法分配到'id',因为它是只读属性
bytedancer.id = 123456;
//成功:任意属性标注下可以添加任意属性
bytedancer.school = 'DMU';
//报错:缺少属性'name',hobby可缺省
const bytedancer2 : IBytedancer = {
    id : 194432,
    sex : 'man',
    age : 21,
}

函数类型

function add(x, y){
    return x + y;
}
const mult = (x, y) => x * y;
interface IMult {
    (x : number, y : number) : number;
}
const mult : IMult = (x, y) => x * y;
function add(x: number, y: number): number {
    return x + y;
}
const mult: (x: number, y: number) => number = (x, y) => x * y;

函数重载

image.png

image (1).png

数组类型

image.png

TypeScript补充类型

image.png

TypeScript泛型

image.png

image (1).png

image (2).png

类型别名 & 类型断言

image.png

字符串/数字 字面量

image.png

In the end

写的很粗糙,想学习ts的友友还是去看官方文档吧

官网地址留在这儿了

TypeScript中文网 · TypeScript——JavaScript的超集