TypeScript 总结

文章目录

  • TypeScript 总结
    • 概述
    • 运行ts文件
      • 方式一
      • 方式二
    • 基础
      • 声明变量
      • 类型
      • 数组
      • 元组
      • 联合类型
        • 取值限制
      • 枚举类型
      • any & unknown
      • void & undefined
      • 类型适配
    • 面向对象
      • 函数
        • 普通函数
        • 箭头函数
        • 可选参数
        • 默认参数
      • 对象
        • 创建对象
        • 对象的类型限制
      • 类和接口
      • 泛型
        • 简单使用
        • 多个泛型
        • 默认泛型类型
    • 进阶
      • 类型守卫
        • 自定义类型守卫
      • 函数重载
      • 调用签名
        • 实现函数重载
        • 实现constructor重载
      • 索引签名
      • readonly 和 Readonly
        • readonly
        • Readonly
      • 双重断言
      • 常量断言
      • this类型检查
      • typeof提取类型
      • keyof提取联合类型

TypeScript 总结

概述

TypeScript 是一种基于 JavaScript 构建的强类型编程语言,可为你提供任何规模的更好工具。

官方文档

中文文档

TypeScript资料

运行ts文件

在这里插入图片描述

方式一

一、安卓typescript:

npm install -g typescript

二、将ts文件编译为js文件:

tsc code.ts

三、运行js文件:

node code.js

查看tsc版本:

tsc -v

使用ES5编译ts代码:

tsc -t es5 demo.ts

方式二

一、安装ts-node:

npm install -g typescript ts-node

二、运行ts文件:

ts-node code.ts

基础

声明变量

var a = 1;
let b = 2;
const c = 3;

类型

TypeScript是JavaScript的一个超集,它添加了静态类型和一些其他的特性。

类型:boolean 布尔值、number 数字、string 字符串、array 数组、tuple 元组、enum 元组、any 任意类型、void、null、undefined、never、object。

数组

let arr1: number[] = [1, 2, 3, 4];
let arr2: Array<number> = [1, 2, 3, 4];
let arr3 = [1, 2, 3, 4];

元组

let person: [string, number] = ["小明", 18];
console.log(person[0]); //小明
console.log(person[1]); //18

联合类型

let union1: string | number;
union1 = 2;
union1 = "hello";

取值限制

let union2: 10 | 20 | 30;
// union2 = 1; //报错
union2 = 10;

枚举类型

enum Color {red,green,blue,
}
let color = Color.red;
console.log(color); //0

自定义值:

enum Sports {football = "足球",basketball = "篮球",pingpong = "乒乓球",
}
let s = Sports.football;
console.log(s); //足球

any & unknown

  • any:任意类型,没有类型检查。
  • unknown:未知类型,会进行类型检查。
let a: any;
a = 123;
a = "abc";
a.eat(); //不会提示报错
let a: unknown;
a = 123;
a = "abc";
a.eat(); //提示报错

void & undefined

  • void:表示没有返回值,主要用于函数。
  • undefined:表示值未定义。
function fun1(): void {}
console.log(fun1()); //undefined
function fun2(): undefined {let a;return a;
}
console.log(fun2()); //undefined

类型适配

类型适配:也称为类型断言,将某个值强转为指定类型。

无类型适配:

let msg: any;
msg = "hello";
let result = msg.endsWith("o");
console.log(result); //true

说明:调用endsWidth方法时没有提示。

适配方式一:

let msg: any;
msg = "hello";
let result = (<string>msg).endsWith("o");

说明:通过<string>将any转为string类型,调用endsWidth方式有提示。

适配方式二:

let msg: any;
msg = "hello";
let result = (msg as string).endsWith("o");

说明:通过as string将any转为string类型。

面向对象

函数

普通函数

function fun(msg: string) {console.log(msg);
}

箭头函数

let fun = (msg: string) => console.log(msg);

可选参数

let fun = (msg: string, code?: number) => console.log(msg);

默认参数

let fun = (msg: string, code: number = 0) => console.log(msg, code);

对象

创建对象

const user = {name: "小明",age: 18,address: "北京市",
};
console.log(user.name);
// console.log(user.nickname); //提示报错

对象的类型限制

let user: { name: string; age: number; address: string };
user = {name: "小明",age: 18,address: "北京市",
};
console.log(user.name);

类和接口

interface IPoint {x: number;y: number;
}
const drawPoint = (point: IPoint) => {console.log({ x: point.x, y: point.y });
};
drawPoint({ x: 100, y: 200 });
// drawPoint({ x: "abc", y: true }); //提示报错
interface IPoint {x: number;y: number;drawPoint: () => void;
}
class Point implements IPoint {x: number;y: number;constructor(x: number, y: number) {this.x = x;this.y = y;}drawPoint() {console.log({ x: this.x, y: this.y });}
}
let p = new Point(2, 3);
p.drawPoint();

泛型

简单使用

// 普通泛型函数
function lastInArray<T>(arr: T[]) {return arr[arr.length - 1];
}
console.log(lastInArray(["a", "b", "c", "d"])); //d
// 箭头泛型函数
const lastInArray = <T>(arr: T[]) => arr[arr.length - 1];
// 联合类型
console.log(lastInArray<string | number>(["a", "b", "c", 1])); //d

多个泛型

let makeArray = <T, Y>(x: T, y: Y) => [x, y];
let result = makeArray("a", true);
console.log(result); //[ 'a', true ]

默认泛型类型

let makeArray = <T, Y = number>(x: T, y: Y) => [x, y];
let result = makeArray<string>("a", 1);
console.log(result); //[ 'a', 1 ]

进阶

类型守卫

在 TypeScript 中,类型守卫是一种表达式,它在编译时期检查某个变量的类型,以确保在某个特定的代码块中,该变量的类型是已知的。这对于避免类型错误非常有用,因为它可以确保你在处理变量时,变量的类型是你期望的那种类型。

type Square = {size: number;
};
type Rectangle = {width: number;height: number;
};
type Shape = Square | Rectangle;function area(shape: Shape) {if ("size" in shape) {return shape.size * shape.size;} else if ("width" in shape) {return shape.width * shape.height;}
}let shape = { size: 20 };
console.log(area(shape)); //400
let shape2 = { width: 20, height: 30 };
console.log(area(shape2)); //600

自定义类型守卫

需要借助is表达式。

type Square = {size: number;
};
type Rectangle = {width: number;height: number;
};
type Shape = Square | Rectangle;function isSquare(shape: Shape): shape is Square {return "size" in shape;
}
function isRectangle(shape: Shape): shape is Rectangle {return "width" in shape;
}function area(shape: Shape) {if (isSquare(shape)) {return shape.size * shape.size;} else if (isRectangle(shape)) {return shape.width * shape.height;}
}let shape = { size: 20 };
console.log(area(shape)); //400
let shape2 = { width: 20, height: 30 };
console.log(area(shape2)); //600

函数重载

在TypeScript中,函数重载是指在一个函数名下定义多个函数签名,每个函数签名对应不同的参数类型和返回值类型。通过函数重载,我们可以根据不同的参数类型和返回值类型来实现不同的函数行为。

function reverse(string: string): string;
function reverse(array: string[]): string[];
function reverse(stringOrArray: string | string[]) {if (typeof stringOrArray == "string") {return stringOrArray.split("").reverse().join("");} else {return stringOrArray.slice().reverse();}
}console.log(reverse("hello")); //olleh
console.log(reverse(["h", "e", "l", "l", "o"])); //[ 'o', 'l', 'l', 'e', 'h' ]
function makeDate(timestamp: number): Date;
function makeDate(year: number, month: number, day: number): Date;
function makeDate(timestampOrYear: number, month?: number, day?: number) {if (month != null && day != null) {return new Date(timestampOrYear, month - 1, day);} else {return new Date(timestampOrYear);}
}console.log(makeDate(1688368612562));
console.log(makeDate(2008, 9, 10));

调用签名

TypeScript调用签名是指在TypeScript中定义函数或方法时,指定函数的参数类型和返回值类型。通过调用签名,我们可以明确指定函数的输入和输出类型,以提高代码的可读性和可维护性。

type Add = (a: number, b: number) => number;const add: Add = (a: number, b: number) => {return a + b;
};
console.log(add(2, 3)); //5

实现函数重载

type Add = {(a: number, b: number): number;(a: number, b: number, c: number): number;
};
const add: Add = (a: number, b: number, c?: number) => {return a + b + (c != null ? c : 0);
};console.log(add(1, 2)); //3
console.log(add(1, 2, 3)); //6

实现constructor重载

type Point = {new (x: number, y: number): { x: number; y: number };new (x: number, y: number, z: number): { x: number; y: number };
};
const point: Point = class {constructor(public x: number, public y: number, public c?: number) {}
};const p1 = new point(2, 3);
const p2 = new point(2, 3, 4);
console.log(p1); //{ x: 2, y: 3, c: undefined }
console.log(p2); //{ x: 2, y: 3, c: 4 }

索引签名

type Person = {name: string;age: number;
};
type PersonDictionary = {[username: string]: Person;
};
const persons: PersonDictionary = {aaa: {name: "小明",age: 18,},bbb: {name: "小红",age: 28,},
};console.log(persons["aaa"]); //{ name: '小明', age: 18 }
console.log(persons["bbb"]); //{ name: '小红', age: 28 }// 添加数据
persons["ccc"] = {name: "小白",age: 38,
};

readonly 和 Readonly

  • readonly:是关键字,表示只读变量。
  • Readonly:是类型,表示只读类型。

readonly

function reverseSorted(input: readonly number[]): number[] {return [...input].sort().reverse();
}console.log(reverseSorted([1, 2, 3, 4])); //[ 4, 3, 2, 1 ]
type MyReadOnly = {readonly [key in "x" | "y" | "z"]: number;
};
const p: MyReadOnly = {x: 10,y: 20,z: 30,
};
// p.x = 100; //提示报错
console.log(p); //{ x: 10, y: 20, z: 30 }

Readonly

type Person = {name: string;age: number;
};
const p: Readonly<Person> = {name: "小明",age: 18,
};
// p.name = "小白"; //提示报错

双重断言

type Point2D = { x: number; y: number };
type Point3D = { x: number; y: number; z: number };
type Person = { name: string; address: string };let point2D: Point2D = { x: 1, y: 2 };
let point3D: Point3D = { x: 1, y: 2, z: 3 };
let person: Person = { name: "小明", address: "北京" };// point2D = point3D; //可以转换
// point3D = point2D; //提示报错
// point3D = point2D as Point3D; //类型断言
point3D = person as any as Point3D; //双重断言

常量断言

const person = {name: "小明",age: 18,
} as const;
// obj = {}; //提示报错
// obj.name = "abc"; //条报报错

this类型检查

function double(this: { value: number }) {this.value = this.value * 2;
}
const num = {value: 10,double,
};
num.double();
console.log(num.value); //20

typeof提取类型

const person = {name: "小明",age: 18,sex: true,
};
type Person = typeof person;
const p1: Person = {name: "小白",age: 28,sex: false,
};
console.log(p1); //{ name: '小白', age: 28, sex: false }

keyof提取联合类型

type Person = {name: string;age: number;sex: boolean;
};
type PersonKey = keyof Person;
function getValueByKey(obj: Person, key: PersonKey) {return obj[key];
}
let p: Person = {name: "小明",age: 18,sex: false,
};
let age = getValueByKey(p, "age");
console.log(age); //18

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/8088.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言经典案例-2

今天继续给大家分享C语言学习的经典练手案例 记录在校学习第三天&#xff0c;继续加油 今日案例来源&#xff1a;csdn社区每日一练 1.商品优惠计算机 商品优惠计算器 使用if语句编程实现输入购货金额&#xff0c;输出实际付款金额。购货折扣率如下&#xff1a; 购货金额≤500元…

obs录制功能源码分析

录制按钮 界面文件&#xff1a; 主界面:OBSBasic.ui 中开始录制按钮的objectName 是 recordButton 槽函数&#xff1a; void OBSBasic::on_recordButton_clicked() {//1 输出模式是否被激活if (outputHandler->RecordingActive()) {bool confirm config_get_bool(GetGlo…

LiDAR SLAM 闭环——BoW3D: Bag of Words for Real-time Loop Closing in 3D LiDAR SLAM

先说总结 现算法已经开源&#xff0c;代码链接&#xff1a; GitHub - YungeCui/BoW3D: [RA-L] BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM. 背景 SLAM&#xff08;同时定位与地图构建&#xff09;是一种让机器人在构建环境地图的同时&#xff0c;定位…

Spring整合Junit单元测试

1.Spring整合Junit单元测试 1.1 原始Junit测试Spring的问题 在测试类中&#xff0c;每个测试方法都有以下两行代码&#xff1a; ApplicationContext ac new ClassPathXmlApplicationContext("application.xml");BookDao bookDao (BookDao)ac.getBean("bookDa…

Angular 调试 —— 一个真实的多重循环导致的Bug

导致性能问题的原因可能很复杂&#xff0c;也可能很简单&#xff0c;今天让我们来看一个现实的例子。一个多重循环导致列表卡死。 startDemo() {this.processing true// 创建复杂数据结构const data [];for (let i 0; i < 5000; i) {const innerArray [];for (let j …

(小程序)uniapp调接口完整流程

(小程序)uniapp调接口完整流程 代码&#xff1a; <script lang"ts" setup>import { ref } from "vue"; const form ref({searchVal: "", });//搜索const searchClick () > {console.log(form.value.searchVal)let data {text: form…

git merge 和git rebase的区别

文章目录 1. 概念2. git merge2.1. 示例 3. git rebase3.1. 示例 4. 总结 1. 概念 在Git版本控制系统中&#xff0c;有两种方式可以将一个分支的更改合并到另一个分支&#xff1a;git merge 和 git rebase。虽然它们都可以完成相同的任务&#xff0c;但它们的实现方式有所不同…

软考:中级软件设计师:计算机存储结构,cache,局部性原理,RAM和ROM,磁盘结构和计算

软考&#xff1a;中级软件设计师:计算机存储结构 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的…

用git下载gitee上的项目资源

目录 用git下载gitee上的项目资源 用git 的clone 命令 然后到gitee上复制相关的下载地址&#xff1a; 粘贴到clone后面即可&#xff08;注意地址与clone之间有空格&#xff01;&#xff01;&#xff01;&#xff09; 运行结果&#xff1a; 用git下载gitee上的项目资源 用git…

软件设计模式与体系结构-设计模式-行为型软件设计模式-迭代器模式

行为型软件设计模式 概述 行为型设计模式是软件设计模式中的一类&#xff0c;用于处理对象之间的交互和通信。这些模式关注的是对象之间的行为和职责分配。以下是几种常见的行为型设计模式&#xff1a; 观察者模式&#xff08;Observer Pattern&#xff09;&#xff1a;定义了…

【CEEMDAN-VMD-GRU】完备集合经验模态分解-变分模态分解-门控循环单元预测研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【随手记】使用Flask做代理为虚拟机提供pip源

最近在重做虚拟机环境&#xff0c;虚拟机不可连外网&#xff0c;最初python包都是通过离线whl进行安装。但是离线文件已经找不到了&#xff0c;不想重新去一个个下载&#xff0c;而且本地环境跟虚拟机环境也不一致&#xff0c;pip download可能会遇到版本问题&#xff0c;遂考虑…