前言
是在有一定的JavaScript的基础上,因为公司的一些项目有TypeScript代码,所以想了解一下。
本文是学习菜鸟教程和TypeScript官网整理的一部分笔记。
TypeScript
TypeScript 提供了 JavaScript 的所有功能,并在这些功能之上添加了一层: TypeScript 的类型系统。
定义类型
数据类型 | 关键字 | 描述 |
---|---|---|
任意类型 | any | 声明为 any 的变量可以赋予任意类型的值。 let arrayList: any[] = [1, false, 'fine'];// 定义存储各种类型数据的数组时 |
数字类型 | number | 双精度 64 位浮点值。它可以用来表示整数和分数。 let binaryLiteral: number = 0b1010; // 二进制 let octalLiteral: number = 0o744; // 八进制 let decLiteral: number = 6; // 十进制 let hexLiteral: number = 0xf00d; // 十六进制 |
字符串类型 | string | 一个字符系列,使用单引号(')或双引号(")来表示字符串类型。反引号(`)来定义多行文本和内嵌表达式。 let name: string = "Runoob"; let years: number = 5; let words: string =`您好,今年是 ${ name } 发布 ${ years + 1} 周年`; |
布尔类型 | boolean | 表示逻辑值:true 和 false。let flag: boolean = true; |
数组类型 | 无 | 声明变量为数组。 // 在元素类型后面加上[] let arr: number[] = [1, 2]; // 或者使用数组泛型 let arr: Array<number> = [1, 2]; |
元组 | 无 | 元组类型用来表示已知元素数量和类型的数组,各元素的类型不必相同,对应位置的类型需要相同。 let x: [string, number]; x = ['Runoob', 1]; // 运行正常 x = [1, 'Runoob']; // 报错 console.log(x[0]); // 输出 Runoob |
枚举 | enum | 枚举类型用于定义数值集合。 enum Color {Red, Green, Blue}; let c: Color = Color.Blue; console.log(c); // 输出 2 |
void | void | 用于标识方法返回值的类型,表示该方法没有返回值。 function hello(): void { alert("Hello Runoob"); } |
null | null | 表示对象值缺失。 |
undefined | undefined | 用于初始化变量为一个未定义的值 |
never | never | never 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值。 |
readonly 修饰符: 只可以从中读取而不能修改
const codeNames: readonly string[] = ['Coding', 'God']
枚举
如果某个属性的值是计算出来的,那么它后面一位的成员必须要初始化值。
const getValue = () => { return 0 } enum List { A = getValue(), B = 2, // 此处必须要初始化值,不然编译不通过 C } console.log(List.A) // 0 console.log(List.B) // 2 console.log(List.C) // 3
接口
对象
interface User { name: string; id: number; } const user: User = { name: "Hayes", id: 0, };
类
interface User { name: string; id: number; } class UserAccount { name: string; id: number; constructor(name: string, id: number) { this.name = name; this.id = id; } } const user: User = new UserAccount("Murphy", 1);interface User { name: string; id: number; } //对返回值进行类型定义 function getAdminUser(): User { //... } //对参数进行类型定义 function deleteUser(user: User) { // ... }
数组
接口中我们可以将数组的索引值和元素设置为不同类型,索引值可以是数字或字符串。
interface namelist { [index:number]:string }
接口继承
单继承实例
interface Person { age:number } interface Musician extends Person { instrument:string } var drummer = <Musician>{}; drummer.age = 27 drummer.instrument = "Drums"多继承实例
interface IParent1 { v1:number } interface IParent2 { v2:number } interface Child extends IParent1, IParent2 { } var Iobj:Child = { v1:12, v2:23}
组合类型
联合
要了解变量的类型, 使用 typeof
:
类型 | 推断语句 |
---|---|
string | typeof s === "string" |
number | typeof n === "number" |
boolean | typeof b === "boolean" |
undefined | typeof undefined === "undefined" |
function | typeof f === "function" |
array | Array.isArray(a) |
可以用 | 来支持多种类型
let x: number | null | undefined; //处理array或者string function getLength(obj: string | string[]) { return obj.length; } // 参数是string | undefined function ex(param1?: string){}
泛型
let list: Array<number> = [1, 2, 3]; type StringArray = Array<string>; type NumberArray = Array<number>; type ObjectWithNameArray = Array<{ name: string }>;
结构化的类型系统
如果对象或类具有所有必需的属性,则 TypeScript 将表示是它们匹配的,而不关注其实现细节。
interface Point { x: number; y: number; } function logPoint(p: Point) { console.log(`${p.x}, ${p.y}`); } // 打印 "12, 26" const point = { x: 12, y: 26 }; logPoint(point); interface Point { x: number; y: number; } //类 function logPoint(p: Point) { console.log(`${p.x}, ${p.y}`); } // ---分割线--- class VirtualPoint { x: number; y: number; constructor(x: number, y: number) { this.x = x; this.y = y; } } const newVPoint = new VirtualPoint(13, 56); logPoint(newVPoint); // 打印 "13, 56"
变量作用域
var global_num = 12 // 全局变量 class Numbers { num_val = 13; // 实例变量 static sval = 10; // 静态变量 storeNum():void { var local_num = 14; // 局部变量 } } console.log("全局变量为: "+global_num) console.log(Numbers.sval) // 静态变量 var obj = new Numbers(); console.log("实例变量: "+obj.num_val)