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 ]

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

相关推荐
lovingsoft6 分钟前
Chrome Lighthouse 详解
前端·chrome
Qlly16 分钟前
全栈工程师怎么接需求?从一句「加个功能」聊到能开发、能验收
前端·后端
马可家的菠萝20 分钟前
你的微信“文件传输助手”,是不是已经成了第二个网盘?
前端·后端·架构
略略略啦21 分钟前
Vibe Coding 基于Spec DD和TDD的实践指南
前端
shmily麻瓜小菜鸡41 分钟前
前端实现图片与PDF文字识别敏感信息打码方案
前端·pdf·状态模式
打工仔折腾 AI1 小时前
LangChain 工具调用实战:从 Tool 定义到 Agent 执行链路拆解
java·前端·人工智能·后端·python·langchain·ai agent 实战
汉堡大王95271 小时前
单次输出拉到100万Token:拆完 Gemini 4 Argon 的续写协议,才看懂谷歌这7个月在憋什么
前端·人工智能·后端
看浪的路人1 小时前
第9讲:大模型应用监控与可观测性——OpenTelemetry + Prometheus + Grafana 全链路追踪
java·前端·spring
内存过载1 小时前
用表格模拟甘特图:项目排期的土办法
前端·低代码
葡萄城技术团队1 小时前
用 SpreadJS 数据验证实现省市区三级联动
前端