TypeScript

javascript 复制代码
npm i typescript -g
tsc -v

一、基础类型

javascript 复制代码
tsc --init  // 会生成 tsconfig.json
tsc -w

打开另一个终端

javascript 复制代码
node index.js
javascript 复制代码
let num: number = 123;
let str: string = "小满";
let b: boolean = true;
let n: null = null;
let u: undefined = undefined;
// let v1: void = null;
let v2: void = undefined;

// 函数没有返回值
function myFn(): void {
  // 不能 return 任何值
}

二、任意类型

javascript 复制代码
npm i ts-node -g

生成 package.json

javascript 复制代码
npm init -y

声明文件

javascript 复制代码
npm i @types/node -D

现在可以只开一个控制台,执行

javascript 复制代码
ts-node index.ts

any 任意类型;unknown 不知道类型

  1. top type:顶级类型 any unknown,可以包含下面所以类型

  2. Object

  3. 自身实例:Number String Boolean

  4. number string boolean

  5. 1 '小满' false

  6. never

javascript 复制代码
let a: any = [];
let a: unknown = [];
a = 1;
a = "123";
a = false;
a = Symbol(1);

// unknown 和 any 也是有一定区别的:
let a: any = 1;
let b: number = 5;

a = b;
b = a;

(1)unknown 不可以赋值给别的类型的,只能赋值给自身或者 any

javascript 复制代码
let a: unknown = 1;
let b: number = 5;

a = b;
b = a; // 报错

(2)unknown 没有办法读取任何属性,方法也不可以调用

javascript 复制代码
let xiaoman: unknown = { shuai: true, open: () => 123 };
xiaoman.shuai; // 报错
xiaoman.open; // 报错

// any 类型则不报错

三、Object、object 以及 {}

1. Object

所有原始类型以及对象类型都指向 Object

在 ts 中,Object 表示包含所有类型

javascript 复制代码
let a: Object = 123;
let a1: Object = "123";
let a2: Object = [];
let a3: Object = {};
let a4: Object = () => 123;

2. object

常用于泛型约束,代表非原始类型的一种类型,不支持 原始类型,支持所有 引用类型

javascript 复制代码
let a: object = 123; // 错误 原始类型
let a1: object = "123"; // 错误 原始类型
let a2: object = false; // 错误 原始类型
let a3: object = []; // 正确
let a4: object = {}; // 正确
let a5: object = () => 123; // 正确

3. {}

可以理解成 new Object,和第一个一样,原始类型 和 引用类型 都可以

javascript 复制代码
let a: {} = 123;
let a1: {} = "123";
let a2: {} = [];
let a3: {} = {};
let a4: {} = () => 123;

虽然字面量模式可以赋值任意类型,但是赋值之后无法修改

javascript 复制代码
let a: {} = { name: 1 };

// 无法对变量进行任何操作
a.age = 2; // 报错,没有办法 增加

最好少用

四、接口和对象类型

使用 interface 来定义一种约束,让数据的结构满足约束的格式

不能多属性,也不能少属性

1. 重名,重合

javascript 复制代码
interface Axx {
  name: string;
  age: number;
}

interface Axx {
  Ikun: string;
}

等同于

javascript 复制代码
interface Axx {
  name: string;
  age: number;
  Ikun: string;
}

2. 定义任意 key

索引签名

javascript 复制代码
interface Axx {
  name: string;
  age: number;
  [propName: string]: any;
}

let a: Axx = {
  name: "小满",
  age: 88,
  a: 1,
  b: 2,
  c: 3,
};

3. 可选操作符 & readonly

javascript 复制代码
interface Axx {
  name: string;
  age?: number; // 可选操作符
  readonly id: number;
  readonly callback: () => boolean;
}

let a: Axx = {
  name: "小满",
  id: 1,
  callback: () => {
    return false;
  },
};

a.callback();

// 以下报错
a.callback = () => {
  return true;
};

一般函数或者 id 会写 readonly,不能随便改

4. 接口继承

javascript 复制代码
interface Axx extends B {
  name: string;
  age?: number; // 可选操作符
  readonly id: number;
  readonly callback: () => boolean;
}

interface B {
  xxx: string;
}

let a: Axx = {
  xxx: "xxx",
  name: "小满",
  id: 1,
  callback: () => {
    return false;
  },
};

A 继承 B,A 与 B 合并,a 必须具备 xxx 属性

5. 定义函数类型

javascript 复制代码
interface Fn {
  (name: string): number[];
}

const fn: Fn = function (name: string) {
  return [1];
};

五、数组类型

1. 数组普通类型

javascript 复制代码
let arr: number[] = [1, 2, 3, 4, 5];
let arr1: boolean[] = [true, false];

泛型方式

javascript 复制代码
let arr2: Array<boolean> = [true, false];

2. 定义对象数组,使用 interface

javascript 复制代码
interface X {
  name: string;
  age?: number;
}

let arr: X[] = [{ name: "小满" }, { name: "胡萝卜" }];

3. 二维数组

javascript 复制代码
let arr: number[][] = [[1], [2], [3]];

泛型方式

javascript 复制代码
let arr1: Array<Array<number>> = [[1], [2], [3]];

4. 大杂烩数组

javascript 复制代码
let arr: any = [1, "sadsad", true, {}];

5. 数组在函数中的用法

javascript 复制代码
// ... 是拓展运算符,可用于将函数参数收集后转为一个数组实例
function a(...args: string[]) {
  console.log(args); // ['1','2']
}

a("1", "2");

arguments 是类数组,但是没有数组上的方法

javascript 复制代码
function b(...args: string[]) {
  console.log(arguments); // {'0':'1','1':'2'}
  let b: IArguments = arguments;
}

b("1", "2");

// IArguments 原理
interface A {
  callee: Function;
  length: number;
  [index: number]: any;
}

六、函数类型

1. 函数定义类型和返回值

javascript 复制代码
function add(a: number, b: number): number {
  return a + b;
}

console.log(add(1, 1)); // 2

箭头函数定义类型和返回值

javascript 复制代码
const add = (a: number, b: number): number => a + b;

console.log(add(1, 1)); // 2

2. 函数默认的参数

javascript 复制代码
function add(a: number = 10, b: number = 20): number {
  return a + b;
}

console.log(add()); // 30

函数可选参数

javascript 复制代码
function add(a: number = 10, b?: number): number {
  return a + b;
}

console.log(add()); // NaN

3. 参数是一个对象如何定义

javascript 复制代码
interface User {
  name: string;
  age: number;
}

function add(user: User): User {
  return user;
}

console.log(add({ name: "小满", age: 24 })); // { name: '小满', age: 24 }

4. 函数 this 类型

javascript 复制代码
interface Obj {
  user: number[];
  add: (this: Obj, num: number) => void;
}

// ts 可以定义 this 的类型,必须是第一个参数定义 this 的类型
// js 种无法使用
let obj: Obj = {
  user: [1, 2, 3],
  add(this: Obj, num: number) {
    this.user.push(num);
  },
};

obj.add(4);
console.log(obj); // { user: [ 1, 2, 3, 4 ], add: [Function: add] }

5. 函数重载

javascript 复制代码
let user: number[] = [1, 2, 3];
function findNum(add: number[]): number[]; // 如果传的是一个 number 类型的数组,那就做添加
function findNum(id: number): number[]; // 如果传入了 id, 就是单个查询
function findNum(): number[]; // 如果没有传入东西就是查询全部

function findNum(ids?: number | number[]): number[] {
  if (typeof ids == "number") {
    return user.filter((v) => v == ids);
  } else if (Array.isArray(ids)) {
    user.push(...ids);
    return user;
  } else {
    return user;
  }
}

console.log(findNum()); // [ 1, 2, 3 ]
console.log(findNum(3)); // [ 3 ]
console.log(findNum([4, 5, 6])); //[ 1, 2, 3, 4, 5, 6 ]

七、联合类型 | 类型断言 | 交叉类型

相关推荐
一只会跑会跳会发疯的猴子8 分钟前
Thinkphp6使用token+Validate验证防止表单重复提交
服务器·前端·javascript
Euphoria_111029 分钟前
开发积累总结
前端
柒七爱吃麻辣烫30 分钟前
npm修改镜像的教程,将npm镜像修改为国内地址增加下载速度
java·前端·npm·node.js·vue
想回家的一天34 分钟前
本地环境下 前端突然端口占用问题 针对vscode
前端
小张快跑。1 小时前
【Vue3】(二)vue3语法详解:自定义泛型、生命周期、Hooks、路由
前端·vue.js·typescript
开开心心就好1 小时前
可增添功能的鼠标右键优化工具
前端·pdf·计算机外设·ocr·电脑·音视频·phpstorm
灿灿121381 小时前
npm、pnpm、yarn 各自优劣深度剖析
前端·javascript·npm·pnpm·yarn
Name:PLC2 小时前
vue3中使用watch
前端·javascript·vue.js
超级土豆粉2 小时前
ES6 扩展运算符与 Rest 参数
前端·ecmascript·es6