这是我参与「第四届青训营 」笔记创作活动的第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 的超集。 那么它有什么特别之处呢?
- 简单来说,js 有的 ts 都有,所有js 代码都可以在 ts 里面运行。
- ts 支持类型支持,ts = type +JavaScript。
那么 ts 和 js 有什么区别呢?
-
JavaScript 属于动态编程语言,而ts 属于静态编程语言。
- js:边解释边执行,错误只有在运行的时候才能发现
- ts:先编译再执行,在写的时候就会发现错误了(ts不能直接执行,需要先编译成 js )
-
ts 完全支持 js ,可以直接转换
-
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;
函数重载
数组类型
TypeScript补充类型
TypeScript泛型
类型别名 & 类型断言
字符串/数字 字面量
In the end
写的很粗糙,想学习ts的友友还是去看官方文档吧
官网地址留在这儿了