安装
1 2 3 4
| npm install typescript -g npm install tslib -g npm i @types/node --save-dev (node环境支持的依赖必装) npm i ts-node --g
|
运行
第一种:切到代码文件目录想下,在命令行执行:tsc xxx.ts
转换成js,然后再通过node运行js文件。
第二种:ts-node xxx.ts
基础类型
1、字符串
1 2 3 4 5 6
|
let a: string = "TS";
let muban: string = `web ${a}`; console.log(muban);
|
``是ES6中的模板语法,${a}用来在模板字符串中嵌入表达式。
2、数字类型
支持十六进制、十进制、八进制和二进制。
1 2 3 4 5 6 7 8 9 10 11
| let notANumber: number = NaN; let num: number = 123; let infinity: number = Infinity; let decimal: number = 6; let hex: number = 0xf00d; let binary: number = 0b1010; let octal: number = 0o744;
let nums: number = 0; console.log(nums);
|
3、布尔类型
1 2 3 4 5 6
| let bool: boolean = true;
let bool2: boolean = Boolean(1); console.log(bool); console.log(bool2);
|
如下这样会报错:
1 2 3 4 5
| let createdBoolean: boolean = new Boolean(1)
let createdBoolean: Boolean = new Boolean(1)
|
4、空值类型
JavaScript 没有空值(Void)的概念,在 TypeScript 中,可以用 void
表示没有任何返回值的函数。
1 2 3 4 5 6 7 8 9 10 11
| let u: void = undefined; let n: void = null; console.log(u, n);
function fnVoid(): void { return; } fnVoid();
|
如果tsconfig.json
开启了严格模式:
1 2 3 4 5
| { "compilerOptions":{ "strict": true } }
|
null不能赋予
void类型
5、Null和undefined类型
1 2 3 4
| let u: undefined = undefined; let n: null = null; console.log(u, n);
|
void和undefined和null最大的区别是:undefined
和 null
是所有类型的子类型,也就是说 undefined
类型的变量,可以赋值给 string 类型的变量:
1 2 3 4 5
| let test: void = undefined let num2: string = "1" num2 = test
|
1 2 3 4 5 6 7 8 9 10 11
| let test: null = null let num2: string = "1" num2 = test
let test: undefined = undefined let num2: string = "1" num2 = test
|
任意类型
Any类型和unknown顶级类型
Any类型没有强制限定哪种类型,随时切换类型都可以,对Any进行的任何操作,不需要检查类型。
1 2 3 4
| let anys: any = 123; anys = "234"; anys = true; console.log(anys);
|
声明变量的时候没有指定任意类型默认为any
1 2 3
| let anys; anys = '123' anys = true
|
弊端如果使用any 就失去了TS类型检测的作用.
typescript3.0中引入的 unknown 类型也被认为是 top type ,但它更安全。与 any 一样,所有类型都可以分配给unknown
unknow unknow类型比any更加严格当你要使用any 的时候可以尝试使用unknow。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| let value: unknown; value = true; value = 42; value = "hhh"; value = []; value = {}; value = null; value = undefined; value = Symbol("type");
let num: unknown = "123"; let nums: string = names;
let num1: any = "123"; let num2: string = num1;
let num3: unknown = "12321"; let num4: any = 321; num4 = num3;
|
如果是any类型
,在对象没有这个属性的时候,去获取是不会报错的。
1 2
| let a: any = {a:111} a.a
|
如果是unknow是不能调用属性和方法的
1 2 3
| let a:unknown = {b:1,c:():number=>111} a.b a.c()
|
接口与对象类型
对象的类型
在typescript中,我们定义对象的方式需要用到关键字interface(接口), 我的理解是使用interface来定义一种约束,让数据的结构满足约束的格式。定义方式如下:
1 2 3 4 5 6 7 8 9 10 11
|
interface Person { a: string; b: string; } const person: Person = { a: "2131", };
|
重名的interface 可以合并:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| interface Person { a: string; b: string; } interface Person { age: number; } const person: Person = { a: "2131", b: "123", age: 123, }; console.log(person);
|
继承:
1 2 3 4 5 6 7 8 9 10
| interface A { name: string; } interface B extends A { age: number; } let c: B = { age: 12, name: "张三", };
|
可选属性 ?操作符
1 2 3 4 5 6 7 8 9
| interface Person { a: string; b?: string; } const person: Person = { a: "123", }; console.log(person);
|
任意属性[propName: string]
需要注意,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集:
1 2 3 4 5 6 7 8 9 10 11 12 13
| interface Person { a: string; b?: number; [propName: string]: any; }
const person: Person = { a: "123", c: "213", d: 312, }; console.log(person);
|
只读属性readonly
readonly 只读属性是不允许被赋值的只能读取
1 2 3 4 5 6 7 8 9 10 11
| interface Person { readonly a: string; b?: number; [propName: string]: any; } const person: Person = { a: "123", c: 123 }
person.a = "312"
|
添加函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| interface Person { readonly a: string; b?: number; [propName: string]: any; func(): void; }
const person: Person = { a: "123", c: "123", func: () => { console.log(666); }, }; person.func(); console.log(person);
|
数组类型
类型[]
1 2 3 4 5 6 7 8
| let arr: number[] = [123];
let arr1: number[] = [1, 2, 3, "1"];
let arr2: number[] = [1, 2, 3]; arr2.unshift(4); console.log(arr2);
|
数组泛型
1 2 3
| let arr: Array<number> = [1, 2, 3, 4]; let arr1: Array<string> = ["1", "2"]; console.log(arr, arr1);
|
用接口表示数组
1 2 3 4 5 6
| interface NumberArray { [index: number]: string; } let fibona: NumberArray = ["1", "2"]; console.log(fibona);
|
多维数组
1 2 3 4 5 6 7 8 9 10 11
| let arr: number[][] = [ [1, 2], [3, 4], ];
let arr1: Array<Array<number>> = [ [1, 2], [3, 4], ]; console.log(arr1);
|
arguments类数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function Arr(...args: any): void { console.log(arguments);
let arr: number[] = arguments; } Arr(111, 222);
function Arr(...args: any): void { console.log(arguments); let arr: IArguments = arguments; } Arr(111, 222);
interface IArguments { [index: number]: any; length: number; callee: Function; }
|
any在数组中的应用
1
| let list: any[] = ["test", 1, [], { a: 1 }];
|
函数扩展
函数的类型
1 2 3 4 5 6
| const fn = (name: string, age: number): string => { return name + age; }; console.log(fn("张三", 18));
|
函数的可选参数?
1 2 3 4 5
| const fn = (name: string, age?: number): string => { return name + age; }; console.log(fn("张三"));
|
函数参数的默认值
1 2 3 4
| const fn = (name: string, age: number = 123): string => { return name + age; }; console.log(fn("张三"));
|
接口定义函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| interface Add { (num: number, num2: number): number; } const fn: Add = (num: number, num2: number): number => { return num + num2; }; console.log(fn(1, 3));
interface user { name: string; age: number; } function getUser(user: user): user { return user; } console.log(getUser({ name: "213", age: 123 }));
|
定义剩余参数
1 2 3 4 5 6
| const fn = (array: number[], ...items: any[]): any[] => { console.log(array, items); return items; }; let a: number[] = [1, 2, 3]; console.log(fn(a, "4", "5"));
|
函数重载
重载是方法名字相同,而参数不同,返回类型可以相同也可以不同
如果参数类型不同,则参数类型英设置为any
参数数量不同可以将不同参数设置为可选
1 2 3 4 5 6 7 8 9 10
| function func(params: number): void; function func(params: string, params2: number, [propName, string]: any): void; function func(params: any, params2?: any, d?: string): void { console.log("params:", params); console.log("params2:", params2); console.log(d); }
func(31); func("123", 321, 123);
|