一、TS基础概念
1、什么是TS
a、原理
- ts是JavaScript的一个超集,在原有的语法基础上,添加了可选静态类型和基于类的面向对象编程
- 面向项目:TS - 面向解决大型复杂项目,架构以及代码维复杂的场景 js - 脚本语言,用于面向简单的单一逻辑场景
- 自主检测:TS - 编译期间,主动发现并纠正问题 js - 运行时报错
- 类型检测:TS - 支持动态合景泰类型检测 js - 弱类型
- 运行流程:TS - 依赖编译,依靠编译打包实现浏览器运行 js - 可直接运行
- 复杂特性:模块化、泛型、接口
b、安装运行
npm install -g typescript
tsc -v
tsc dome.ts
2、TS基础类型和写法
- boolean | string | number | array | null | undefined
let isBool = true;
let str = 'hello world';
let num = 123;
let arr = [1, 2, 3];
let nu = null;
let und = undefined;
let isBool: boolean = true;
let str: string = 'hello world';
let num: number = 123;
let arr: Array<number> = [1, 2, 3];
let nu: null = null;
let und: undefined = undefined;
let tuple: [string, number];
tuple = ['hello', 123];
enum Score {
BAD,
NG,
GOOD,
PEREACT,
}
let sco: Score = Score.GOOD;
enum Score {
BAD = 'bad',
NG = 'ng',
GOOD = 'good',
PEREACT = 'perfect',
}
let sco: Score = Score.GOOD;
enum Score {
BAD,
NG,
GOOD,
PEREACT,
}
let scoNmae = Score[0];
let scoKey = Score.BAD;
enum Enum {
A,
B,
C = 'C',
D = 'D',
E = 6,
F,
}
let Enum;
(function (Enum) {
Enum['A'] = 0;
Enum['B'] = 1;
Enum['C'] = 'C';
Enum['D'] = 'D';
Enum['E'] = 6;
Enum['F'] = 7;
Enum[0] = 'A';
Enum[1] = 'B';
Enum['C'] = 'C';
Enum['D'] = 'D';
Enum[6] = 'E';
Enum[7] = 'F';
})(Enum || (Enum = {}));
let a: any = 1;
a = '1';
a = true;
a = [1, 2, 3];
a = { name: 'zhangsan' };
a = () => { };
a = null;
a = undefined;
let a1: bloolean = a;
let b: unknown;
b = 1;
b = '1';
b = true;
let b1: unknown = b;
let b2: any = b;
let b3: number = b;
function fn(): void {
console.log('hello world');
}
consoloe.log(fn());
function fn(): never {
throw new Error('error');
}
function fn(): never {
while (true) { }
}
interface ObjectConstructor {
create(o: object | null): any;
}
const proto = {};
Object.create(proto);
Object.create(null);
Object.create(undefined);
interface Object {
constructor: Function;
toStoring(): string;
toLocaleString(): string;
valueOf(): Object;
}
interface ObjectConstructor{
new(value: any): any1;
}
const obj = {};
obj.pro = 1;
obj.toString();
二、接口 - interface
interface Class {
name: string;
time: number;
}
let class1: Class = {
name: '前端',
time: 1,
}
interface Class {
readonly name: string;
time: number;
}
let arr: number[] = [1, 2, 3];
let arr1: ReadonlyArray<number> = arr;
arr1[0] = 12;
arr1.push(4);
arr1.length = 100;
arr1 = arr;
const arr2 = [1, {name: 1}, 4];
arr2[0] = 12;
arr2.push(5);
arr2.length = 100;
arr2 = [];
interface Class {
readonly name: string;
time: number;
[propName: string]: any;
}
三、交叉类型 - &
interface A {x: D};
interface B {x: E};
interface C {x: F};
interface D {x: number};
interface E {x: bloolean};
interface F {x: string};
type ABC = A & B & C;
let abc: ABC = {
x: {
d: 1,
e: true,
f: 'hello',
}
}
interface A {
c: string;
d: string;
}
interface B {
c: number;
e: string;
}
type AB = A & B;
let ab: AB = {
d: 'hello',
e: 'world',
}
四、断言 - 类型声明、转换 (和编译器的告知交流)
let anyValue: any = 'hello world';
let anyLength: number = (anyValue as string).length;
let anyValue: any = 'hello world';
let anyLength: number = anyValue<string>().length;
type ClassTime = () => number;
const start = (time: ClassTime | undefined) => {
let num = time!();
})
五、类型守卫 - 保障在语法的规定范围内,额外确认
interface A {
name: string;
courses: string[];
}
interface B {
name: string;
startTime: Date;
}
type Class = A | B;
function getClass(classInfo: Class) {
if ('courses' in classInfo) {
console.log(classInfo.courses)
}
if('startTime' in classInfo) {
console.log(classInfo.startTime)
}
}
function getClass(classInfo: Class) {
if (typeof classInfo.name === 'string') {
console.log(classInfo.name)
}
if (typeof classInfo.startTime === 'object') {
console.log(classInfo.startTime)
}
}
const getClass = (classInfo: Class) => {
if (classInfo instanceof A) {
console.log(classInfo.startTime)
}
if (classInfo instanceof B) {
console.log(classInfo.courses)
}
}
六、查漏补缺
1、函数重载 - 重复定义函数
class Class {
start(name: string, school: string): string;
start(name: number, school: number): number;
start(name: string, school: number): string;
start(name: number, school: string): string;
start(name: Combinable, school: Combinaible) {
if(typeof name === 'string' || typeof name === 'string') {
}
}
}
2、泛型 - 重用
- 让模块可以支持多种类型的数据 - 让类型和值一样,可以被赋值传递
function getClass<T,U>(classInfo: T, classInfo1: U) {
return classInfo + classInfo1;
}
console.log(getClass<number, string>(1, 'hello world'));
function getClass<T,U>(classInfo: T, classInfo1: U) {
return `${classInfo}${classInfo1}`
}
3、装饰器 - decorator
{
"compilerOptions": {
"target": "ES5",
"experimentalDecorators": true
}
}
function ClassDecorator(target: Function): void {
target.prototype.getClass = function(): void {
console.log('class decorator')
}
}
@ClassDecorator
class Class {
constructor() {
console.log('class')
}
}
function getWrapper(target: Object, key: string) {
Object.defineProperty(target, key, {
console.log('property decorator');
})
}
class Class {
constructor() {
console.log('class')
}
@getWrapper
public name: string = 'hello world';
}