Docker 常用命令

精简 Docker 常用命令

2022-11-06 · 1 min read

项目管理

项目管理相关知识

2022-11-06 · 1 min read

JS沙箱sandbox的各种实现

我们把Js隔离机制常常称作沙箱

2022-09-18 · 1 min read

Amazing!Solid 比react还react

今天来介绍2个amazing的东东

2022-09-12 · 1 min read

puppeteer应用

使用傀儡师来操作浏览器这个傀儡吧

2022-09-11 · 1 min read

做一个web termianl

前端react, 后端nodejs, 直接可用版web termianl

2022-07-17 · 1 min read

TypeScript里常用的工具类型

经常用到的工具类型,提取抽离出来,供以后复用

2022-06-26 · 1 min read

Vim大法好

想要丢掉鼠标,试试Vim

2022-06-26 · 1 min read

碧血丹心

无论时光如何沾染风霜,也永似红日光

2022-05-10 · 1 min read

chrome V8 引擎中的垃圾回收机制

V8引擎就是nodejs的发动机

2022-03-03 · 1 min read

如何开发一个cli

命令行交互界面是程序员必备的工具,如何开发一个呢?

2022-02-21 · 1 min read

Javascript中的哲学

道生一,一生二,二生三,三生万物

2022-02-20 · 1 min read

React Redux 实现 (Context 版)

React Redux 实现 (Context 版)

2022-02-16 · 1 min read

mobx-react 使用

虽然不常用,但是可以学一下

2022-02-16 · 1 min read

Less中的for和forEach循环

循环的使用是保持代码干燥和避免重复的好方法

2022-02-15 · 1 min read

Webpack Splitchunks 详解

webpack 优化

2022-02-15 · 1 min read

ssh-keygen命令详解

为ssh生成、管理和转换认证密钥

2022-02-15 · 1 min read

使用CURL发送POST请求

curl 是常用的命令行工具,用来请求 Web 服务器。

2022-02-15 · 1 min read

Webpack Plugin 开发

让我们来学一下如何开发一个webpack插件

2022-02-14 · 1 min read

JS 实现两个大数相加?

algo-adding-large-numbers

2022-02-10 · 1 min read

字典树 trie

字典树 trie

2022-02-09 · 1 min read

浏览器原理问题

浏览器原理问题

2022-01-11 · 1 min read

MacBook快速进入一个文件夹目录

mac如何快速进入一个文件夹

2021-10-26 · 1 min read

react合成事件

react-synthetic-event

2021-10-25 · 1 min read

mini webpack实现

通过babel核心来实现迷你版的webpack

2021-10-10 · 1 min read

设计模式

在程序设计中有很多实用的设计模式,而其中大部分语言的实现都是基于类

2021-10-10 · 1 min read

babel核心

babel核心介绍

2021-10-07 · 1 min read

React 15 和 React 16 的区别

react-15-16

2021-10-06 · 1 min read

React性能优化

浅谈react性能优化的方法

2021-10-05 · 1 min read

交通信号灯实现

如何用js来实现交通信号灯呢

2021-09-25 · 1 min read

内存管理

前端中的内存管理

2021-09-25 · 1 min read

前端安全

前端关于安全方面的知识

2021-09-25 · 2 min read

网络和并发

http各版本对于并发的支持,前端如何控制并发量?

2021-09-25 · 1 min read

跨域方法

总结了9种跨域方法

2021-09-24 · 1 min read

react virtualList 虚拟列表无限滚动实现

用react实现虚拟滚动

2021-09-16 · 1 min read

监控埋点方案

前端监控埋点方案

2021-09-16 · 1 min read

Mini useEffect实现

如何实现useEffect?

2021-09-11 · 1 min read

Mini useState 实现

我们来思考一下useState是怎么实现的呢?

2021-09-11 · 1 min read

React Fiber

react-fiber

2021-09-11 · 1 min read

React class组件和function组件异同

类组件和函数组件有何相同点有何不同点呢?

2021-09-11 · 1 min read

Lodash Get 实现

algo-lodash-get

2021-09-08 · 1 min read

手写reduce实现

algo-reduce

2021-09-08 · 1 min read

Hooks 原理概览

react-hooks

2021-09-05 · 1 min read

Hook原理——状态Hook

react-hook-state

2021-09-05 · 1 min read

手写Mini Redux实现

手写一个简易版的redux实现,包含了核心逻辑

2021-09-04 · 1 min read

legacy和concurrent模式

react-legacy-concurrent

2021-09-01 · 1 min read

react架构

总体 react 的核心可以用 ui=fn(state)来表示 3 大核心对象、3 大核心阶段、2 大工作循环 Scheduler(调度器): 排序优先级,让优先级高的任务先进行 reconcile Reconciler…

2021-09-01 · 2 min read

react核心api和jsx

为什么要有jsx,为什么会有虚拟bom

2021-09-01 · 1 min read

setState是同步的还是异步的

react-setstate-usestate

2021-08-31 · 1 min read

如何使用NodeJs创建HTTP服务?

如何使用NodeJs创建HTTP服务?

2021-08-17 · 1 min read

NodeJS 事件循环模型

nodejs-eventloop

2021-08-11 · 2 min read

Buffer

nodejs中的内存管理

2021-08-10 · 1 min read

微前端解决方案-qiankun

目前国内最好的微前端解决方案-qiankun

2021-08-10 · 1 min read

React Mini版实现(1)

学一门技术最好的方法就是做一个其玩具版的实现,我们来尝试实现一下react和react-dom最简单版本吧

2021-08-04 · 1 min read

brew安装

brew 是 MacOS 上的包管理工具,可以简化 macOS 和 Linux 操作系统上软件的安装。

2021-08-04 · 1 min read

CommonJS简易版实现

CommonJS我们经常用,如何实现一个简易版的commonJS呢?

2021-08-01 · 1 min read

极品透明Dashboard样式分享

一个极品透明Dashboard样式分享

2021-07-30 · 1 min read

Stream

nodejs中的流

2021-07-11 · 1 min read

NodeJS全局对象

JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。

2021-05-18 · 1 min read

如何部署Nodejs服务

如何快速的部署一个Nodejs服务到公网呢?

2021-05-12 · 1 min read

Events

events模块是node的核心模块之一,几乎所有常用的node模块都继承了events模块,比如http、fs等。

2021-05-11 · 1 min read

用JS绘制背景,让CSS直接使用 'background:paint(xxx)'

CSS对象新特性,新的background设置方式

2021-04-30 · 1 min read

如何使用Nodejs来创建一个TCP/UDP服务?

如何使用Nodejs来创建一个TCP/UDP服务?

2021-04-17 · 1 min read

Mac使用tree生成目录结构

程序员经常会有需求,需要列出项目的结构树。Mac或者Linux下可以使用tree列出项目结构

2021-04-04 · 1 min read

常见算法

一些比较常见算法

2021-03-20 · 1 min read

前端缓存

对于性能优化离不开缓存

2021-02-28 · 1 min read

前端答疑

一些比较常见的问题

2020-09-02 · 1 min read

Nodejs 网络 & HTTP

nodejs-network

2020-08-14 · 1 min read

JavaScript AST 抽象语法树

源代码的抽象语法结构的树状表现形式

2020-08-02 · 1 min read

nodejs里面向切面编程的一种范式

在一些场景下我们可能需要一种面向切面的编程方式

2020-08-01 · 1 min read

各种JS模块化特性

AMD、CMD、CJS、ESM

2020-05-30 · 1 min read

手写Ajax实现

使用HMR一步步实现Ajax

2020-05-30 · min read

手写PromiseA+实现

如何自己实现promiseA+规范,手写一个promise实现

2020-04-30 · 1 min read

debug和内存泄露

nodejs的debug方法

2020-04-08 · 1 min read

Javascript prototype 原型链

js-prototype

2019-09-07 · 1 min read

this指针、作用域

this是在执行时动态读取上下文决定的,不是在定义时决定

2019-06-14 · 1 min read

call、apply、bind的极简实现

使用symbol实

2019-06-03 · 1 min read

CSS联合选择器区分列表元素个数不同所要求的不同样式

对于列表,在有些时候针对于不同个数的item会有不同的显示,比如col份数,用js固然可以,是否可以用css更简便的实现呢?

2019-04-30 · 1 min read

TypeScript基础

介绍TypeScript基础知识

2019-04-30 · 1 min read

JS中的变量提升

为什么js当时要这样设计

2019-03-07 · 1 min read

ES6之Class

关于ES6里的class, 我们有什么不知道的事?

2019-03-01 · 1 min read

HTTP详解

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议

2019-02-17 · 2 min read

极简代码实现节流Throttle和防抖Debounce

使用各9行代码实现节流和防抖函数

2019-01-30 · 1 min read

Javascript 事件循环 EventLoop

js-eventloop

2018-09-07 · 1 min read

POST和GET区别

POST和GET区别是什么呢?

2018-08-14 · 1 min read

正则表达式

正则表达式一锅端

2018-07-30 · 1 min read

cloneDeep 深克隆实现

algo-clonedeep

2017-09-07 · 1 min read

webpack

engin-webpack

2017-09-07 · 1 min read

http1.1和http2.0有什么区别

http1.1和http2.0有什么区别

2017-06-14 · 1 min read

手写EventEmitter事件巴士

咱们来手写实现一个EventEmitter事件巴士

2017-01-10 · 1 min read

OOP 面向对象编程

对象是什么?为什么要面向对象?

2016-05-08 · 1 min read
Stay hungry & Stay foolish
战歌
16
The Reluctant Warrior
Immediate Music
To Glory
Two Steps From Hell
Victory
Two Steps From Hell
Empire of Angels
Thomas Bergersen
Serenata Immortale
Immediate Music
Cornfield Chase
Hans Zimmer
Tennessee
Hans Zimmer
He's a Pirate
Martin Ermen
Rise
Hans Zimmer
On Thin Ice
Hans Zimmer
Angels Will Rise
Twisted Jukebo
When It All Falls Down
Audiomachine
Icarus
Ivan Torrent
Star Sky - Instrumental
Two Steps From Hell
亡灵序曲
L
Up Is Down
Hans Zimm
回到首页

TypeScript基础

袁官东
April 30th, 2019 · 1 min read
图:Nguyen Nhut

TS

TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。 — 官方文档

TypeScriptJavaScript
JavaScript 的超集,用于解决大型项目的代码复杂性一种脚本语言,用于创建动态网页。
强类型,支持静态和动态类型动态弱类型语言
可以在编译期间发现并纠正错误只能在运行时发现错误
不允许改变变量的数据类型变量可以被赋予不同类型的值

TS 的好处

1、超集,是 js 的加强版,只多不少 2、面向对象 3、静态检查 4、可读性强

类型

12 种基本类型

1number;
2
3string;
4
5boolean;
6
7array;
8
9object;
10
11bigint;
12
13symbol;
14
15null;
16
17undefined;
18
19Date;
20
21Error;
22
23RegExp;

undefined 和 null

默认情况下 null 和 undefined 是所有类型的子类型。 就是说你可以把 null 和 undefined 赋值给 number 类型的变量。

1let age: number = null;
2let realName: string = undefined;

any、unknown 和 void 类型

void 类型与 any 类型相反,它表示没有任何类型。

1function welcome(): void {
2 console.log("hello");
3}

never 类型

never 类型表示的是那些永不存在的值的类型。

1const A: never = 1; // error

元组类型

元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。

1let tuple: [number, string] = [18, "lin"];

可以对元组使用数组的方法,比如使用 push 时,不会有越界报错

push 一个没有定义的类型,报错

可选参数

参数后加个问号,代表这个参数是可选的

1function add(x: number, y: number, z?: number): number {
2 return x + y;
3}
4
5add(1, 2, 3);
6add(1, 2);

enum: 枚举

字符串枚举的意义在于,提供有具体语义的字符串,可以更容易地理解代码和调试。

1enum HttpMethod {
2 GET,
3 POST,
4 PATCH,
5 PUT,
6 DELETE,
7}
8type K = keyof typeof HttpMethod; // 'GET'|'POST'|'PATCH'|'PUT'|'DELETE'

字符串枚举

1enum Direction {
2 Up = "UP",
3 Down = "DOWN",
4 Left = "LEFT",
5 Right = "RIGHT",
6}
7
8const value = 'UP'
9if (value === Direction.Up) {
10 // do something
11}

常量枚举

上文的例子,使用 const 来定义一个常量枚举

1const enum Direction {
2 Up = "UP",
3 Down = "DOWN",
4 Left = "LEFT",
5 Right = "RIGHT",
6}
7
8const value = 'UP'
9if (value === Direction.Up) {
10 // do something
11}

type

类型别名

类型别名会给一个类型起个新名字。 类型别名有时和接口很像,但是可以作用于原始值,联合类型,元组以及其它任何你需要手写的类型。 — TS 文档

interface

interface(接口) 是 TS 设计出来用于定义对象类型的,可以对对象的形状进行描述。

1interface Person {
2 name: string
3 age: number
4}
5
6const p1: Person = {
7 name: 'lin',
8 age: 18
9}

type 和 interface 的区别

1、type 是用于声明类型的,interface 用于描述数据结构

2、type 和 interface 都可以被相互继承和拓展

3、type 可以声明基本类型的别名,联合类型和元组,interface 不行

4、interface 可以合并重复声明

联合类型 |

联合类型一次只能一种类型;而交叉类型每次都是多个类型的合并类型。

1.基础类型联合

1let a: string | number;
2a = 1; //ok
3a = "a"; //ok

2、对象类型联合

对象联合类型只能访问联合中所有共同成员

1interface Women {
2 age: number;
3 sex: string;
4 cry(): void;
5}
6interface Man {
7 age: number;
8 sex: string;
9}
10declare function People(): Women | Man;
11let people = People();
12people.age = 18; //ok
13people.cry(); //error 非共同成员

交叉类型 &

联合类型一次只能一种类型;而交叉类型每次都是多个类型的合并类型。 多种类型的集合,联合对象将具有所联合类型的所有成员

1interface Women {
2 age: number;
3 sex: string;
4 cry(): void;
5}
6interface Man {
7 age: number;
8 sex: string;
9}
10declare function People(): Women | Man;
11let people = People();
12people.age = 18; //ok
13people.cry(); //ok 共同成员

typeof

typeof 操作符可以用来获取一个变量声明或对象的类型。

1function toArray(x: number): Array<number> {
2 return [x];
3}
4
5type Func = typeof toArray; // -> (x: number) => number[]

keyof

keyof 操作符可以用来表示一个对象中的所有 key 值:

1interface Person {
2 name: string;
3 age: number;
4}
5type K1 = keyof Person; // "name" | "age"
1type K1 = keyof boolean; // "valueOf"
2type K2 = keyof any; // string | number | symbol

in

in 用来遍历枚举类型:

1type Keys = "a" | "b" | "c";
2
3type Obj = {
4 [p in Keys]: any;
5}; // -> { a: any, b: any, c: any }

extends

有时候我们定义的泛型不想过于灵活或者说想继承某些类等,可以通过 extends 关键字添加泛型约束。

1、约束

1function getCnames<T extends { name: string }>(entities: T[]): string[] {
2 return entities.map((entity) => entity.cname);
3}

2、继承

1interface ILengthwise {
2 length: number;
3}
4
5function loggingIdentity<T extends ILengthwise>(arg: T): T {
6 console.log(arg.length);
7 return arg;
8}
9
10loggingIdentity(3);
11loggingIdentity({ length: 10, value: 3 });

partial

Partial<T> 的作用就是将某个类型里的属性全部变为可选项 ?

1// Partial
2interface People {
3 name: string;
4 age: number;
5}
6
7// 报错 类型“{}”缺少类型“People”中的以下属性: name, age
8const person1: People = {};
9
10/**
11 那这个时候我们就可以用到typescript自带的高级类型 Partial,就相当于将上方接口所有属性变成可选的
12 将我们需要定义的类型当做泛型传入Partial中,那么就相当于当前的类型里面的所有属性都是可选的
13 */
14const person2: Partial<People> = {}; // 可以
15const person3: Partial<People> = { name: "xiaodu" }; // 可以
16const person4: Partial<People> = { sex: "男" }; // 报错 “sex”不在类型“Partial<People>”中

Reuqired

Required<T> 的作用就是将某个类型里的属性全部变为必选项

1// 必选参数
2interface People {
3 name?: string;
4 age?: number;
5}
6// 类型 "{ name: string; }" 中缺少属性 "age",但类型 "Required<People>" 中需要该属性
7const person2: Required<People> = {
8 name: "11",
9};

Readonly

Readonly<T> 的作用是将某个类型所有属性变为只读属性,也就意味着这些属性不能被重新赋值。

1// 只读
2interface People {
3 name: string;
4 age: number;
5 dog: {
6 name: string;
7 age: number;
8 };
9}
10const xiaoling: Readonly<People> = {
11 name: "小凌", // 只读
12 age: 18, // 只读
13 dog: {
14 age: 1,
15 name: "大黄",
16 },
17};
18// 但是是浅层的。
19xiaoling.name = "john"; // 无法分配到 "name" ,因为它是只读属性。
20xiaoling.dog.age = 2; // 可以

Record

Record<K extends keyof any, T> 的作用是将 K 中所有的属性的值转化为 T 类型。

1interface PageInfo {
2 title: string;
3}
4
5type Page = "home" | "about" | "contact";
6
7const x: Record<Page, PageInfo> = {
8 about: { title: "about" },
9 contact: { title: "contact" },
10 home: { title: "home" },
11};

Exclude

Exclude<T, U> 的作用是将某个类型中属于另一个的类型移除掉。取差集

1type T0 = Exclude<"a" | "b" | "c", "a">; // "b" | "c"
2type T1 = Exclude<"a" | "b" | "c", "a" | "b">; // "c"

omit

Omit<T, U>从类型 T 中剔除 U 中的所有属性 省略 interface

1interface IPerson {
2 name: string
3 age: number
4}
5
6type IOmit = Omit<IPerson, 'age'>
7/**
8 type somePeople = {
9 name: string;
10}
11 */

Extract

Extract<T, U> 的作用是从 T 中提取出 U。取交集

1type T0 = Extract<"a" | "b" | "c", "a" | "f">; // "a"
2type T1 = Extract<string | number | (() => void), Function>; // () => void

Pick

选择、摘取 interface

1type Coord = Record<"x" | "y", number>;
2type CoordX = Pick<Coord, "x">;
3
4// 等用于
5type CoordX = {
6 x: number;
7};

泛型

软件工程中,我们不仅要创建一致的定义良好的 API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。 在像 C# 和 Java 这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件

泛型约束类

定义一个栈,有入栈和出栈两个方法,如果想入栈和出栈的元素类型统一,就可以这么写:

1class Stack<T> {
2 private data: T[] = []
3 push(item:T) {
4 return this.data.push(item)
5 }
6 pop():T | undefined {
7 return this.data.pop()
8 }
9}

Parameters

提取函数的参数类型

1type T1 = Parameters<() => string>; // []
2
3type T2 = Parameters<(arg: string) => void>; // [string]
4
5type T3 = Parameters<(arg1: string, arg2: number) => void>; // [arg1: string, arg2: number]

ReturnType

提取函数的返回值类型

1type T0 = ReturnType<() => string>; // string
2
3type T1 = ReturnType<(s: string) => void>; // void

索引签名

1interface PropChangeHandler {
2 [key: `${string}Changed`]: () => void;
3}
4
5let handlers: PropChangeHandler = {
6 idChanged: () => {}, //ok
7 nameChanged: () => {}, //ok
8 ageChange: () => {}, //error
9};

索引签名参数类型不能为字面量类型或泛型类型 考虑使用映射的对象类型

1type User1 = {
2 [key: "id"]: string; //error
3};
4type User2 = {
5 [key: "id" | "name"]: string; //error
6};
7type User3 = Record<"id", string>;
8type User4 = Record<"id" | "name", string>;

const 断言

1let requestMethod = 'Get';
2let requestMethod2 = 'Get' as const;
3
4type R0 = typeof requestMethod; //string
5type R1 = typeof requestMethod2; // 'Get'

More articles from Favori 重剑

JS中的变量提升

为什么js当时要这样设计

March 7th, 2019 · 1 min read

ES6之Class

关于ES6里的class, 我们有什么不知道的事?

March 1st, 2019 · 1 min read
© 2016–2022 Favori 重剑
Link to $https://github.com/yuanguandongLink to $https://favori.zcool.com.cn/Link to $https://codepen.io/favori