TypeScript 总结

news2024/9/22 9:46:25

文章目录

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

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重载:


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

react基础-React原理揭秘React路由基础

React原理揭秘 目标 能够说出React组件的更新机制能够对组件进行性能优化能够说出虚拟DOM和DIff算法 组件更新机制 setState() 的两个作用 修改state更新组件 过程&#xff1a;父组件重新渲染时&#xff0c;也会重新渲染子组件&#xff0c;但只会渲染当前组件子树&#xff…

BUUCTF Cipher 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 还能提示什么呢&#xff1f;公平的玩吧&#xff08;密钥自己找&#xff09; Dncnoqqfliqrpgeklwmppu 注意&#xff1a;得到的 flag 请包上 flag{} 提交, flag{小写字母} 密文&#xff1a; Dncnoqqfliqrpgeklwmppu解…

vector 数据流查询命令

原文来自&#xff1a;vector 数据流查询命令 | 老五笔记 A lightweight, ultra-fast tool for building observability pipelines&#xff0c;vector在日常运维数据采集中也具有非常重要的作用。很多命令和详细说明可以从官方文档中达到最权威的介绍&#xff1a; Vector | A l…

Nginx【Nginx场景实践(代理服务、 反向代理、负载均衡、负载均衡算法)】(八)-全面详解(学习总结---从入门到深化)

目录 Nginx场景实践_代理服务 Nginx场景实践_反向代理 Nginx场景实践_负载均衡 Nginx场景实践_负载均衡算法 Nginx场景实践_代理服务 正向代理 正向代理&#xff0c;是在用户端的。比如需要访问某些国外网站&#xff0c;我们可能需要购买vpn。 正向代理最大的特点&#…

[软件基础] ELF executable and linking formate

Chapter 7 Object File Format (Linker and Libraries Guide) https://docs.oracle.com/cd/E19683-01/817-3677/chapter6-46512/index.html

何时开始学习Qt和C++,以及如何有效学习?

学习Qt并使用C编程可以为您开发跨平台的图形用户界面&#xff08;GUI&#xff09;应用程序提供良好的基础。下面是一些学习Qt的步骤和建议&#xff0c;以及建议的C知识水平&#xff0c;适合您开始学习Qt&#xff1a; 学习C基础知识&#xff1a;Qt是使用C编写的&#xff0c;因此…

【计算机网络】集线器和交换机的区别

1. 早期–总线型以太网 2. 集线器–星型以太网 3.以太网交换机 4. 集线器和以太网交换机的对比 4.1 单播、多播、同时单播 4.2 扩展以太网的单播 4.3 扩展以太网的多播 4.4 小结

麒麟系统(Liunx)离线安装docker和docker compose

文章目录 一、前言二、准备工作1、查看操作系统版本2、查看操作系统架构 三、安装docker和docker compose1、下载docker离线包2、下载docker compose离线包3、准备 docker.service 系统配置文件4、准备docker的安装脚本文件5、准备docker的卸载脚本文件6、安装 docker 和 docke…

【Axure高保真原型】通过输入框动态控制饼图

今天和大家分享通过输入框动态控制饼图的原型模板&#xff0c;在输入框里维护项目数据&#xff0c;可以自动生成对应的饼图&#xff0c;鼠标移入对应扇形&#xff0c;可以查看对应数据。使用也非常方便&#xff0c;只需要修改输入框里的数据&#xff0c;或者复制粘贴文本&#…

低代码应用开发 高效构建业务系统

低代码是传统软件开发逐步优化和演变的产物&#xff0c;并非全新革命。传统的开发方法过于昂贵和僵化&#xff0c;无法为企业提供所需的高效和敏捷的开发流程&#xff0c;且交付周期长定制能力弱&#xff0c;难以应对不断变化的市场和客户期望&#xff0c;为提高软件开发效率&a…

Python - bool转int,用类型转换还是if-else?

说下结论&#xff0c;虽然直接用int强转的写法比较简洁&#xff0c;但是用if-else的效率更高&#xff08;规避了函数调用的开销&#xff09;。 举个栗子&#xff1a; lst [True, False]def a(a100000):starttime.time()for i in xrange(a):lst[0 if random.choice(lst) else …

PCL vtk 计算点云的体积和表面积

一、CC中计算体积和表面积 二、PCL中计算体积和表面积 vtkMassProperties 来计算体积和表面积&#xff0c;但是必须是三角化的模型&#xff0c;不能是多边形的模型 vtkTriangleFilter如果是其他模型的就转换为三角化的模型 // 计算点云的体积和表面积 // 输入的不能是点云&am…

限时等待

如果一个线程要等待的线程的目标没有实现&#xff0c;那么他会一直等下去&#xff0c;此时就陷入了阻塞等待。 还有一种等待状态叫做延时等待&#xff0c;如果如果我去吃饭&#xff0c;但是饭店已经客满&#xff0c;需要排号&#xff0c;当排到我号时&#xff0c;饭店会叫我&am…

持续挖掘助力创新,亚马逊云科技全新开启“创业加速器”第一期招募

就像人从婴儿开始成长&#xff0c;参天大树从嫩芽开始成长一样&#xff0c;所有成功的企业都是从几个人、初创团队起步发展的。例如&#xff0c;当今全球云计算的 Top 巨头亚马逊云科技&#xff0c;就是从亚马逊内部孵化出来的创业团队&#xff0c;亚马逊现任 CEO Andy Jassy&a…

查看windows上的dll内容

1、安装Visual Studio时选择c桌面开发和通用Windows平台开发 2、cmd运行在Visual Studio安装路径下的VC\Auxiliary\Build\vcvars64.bat 3、在这个窗口中运行dumpbin

【从零开始学习JAVA | 第二十七篇】JAVA期末练习(PTA)

目录 前言&#xff1a; R7-5 Count the letters in a string &#xff08;统计字符串中的字符&#xff09; R7-1 找素数 R7-3 电话号码同步&#xff08;Java&#xff09; 总结&#xff1a; 前言&#xff1a; 临近期末&#xff0c;我也更新一下PTA上的JAVA大题&#xff0c;希望…

TensorFlow项目练手(二)——猫狗熊猫的分类任务

项目介绍 通过猫狗熊猫图片来对图片进行识别&#xff0c;分类出猫狗熊猫的概率&#xff0c;文章会分成两部分&#xff0c;从基础网络模型->利用卷积网络经典模型Vgg。 基础网络模型 基础的网络模型主要是用全连接层来分类&#xff0c;比较经典的方法&#xff0c;也是祖先…

(c语言)给定两个数,求这两个数的最大公约数

目录 方法一 方法二&#xff1a;辗转相除法 方法一 找出两个数中的较小值&#xff0c;从较小值减至两个数%这个数0即可。 //给定两个数&#xff0c;求这两个数的最大公约数 #include <stdio.h>int main() {int a 0;int b 0;scanf("%d %d", &a, &…

【力扣】145、二叉树的后序遍历

145、二叉树的后序遍历 注&#xff1a;二叉树的后序遍历&#xff1a;左右根&#xff1b; // 递归 var postorderTraversal function (root){const arr [];//新建一个数组&#xff1b;const fun (node) >{if(node){fun(node.left);fun(node.right);arr.push(node.val)}}f…

STM32单片机蓝牙APP自动量程万用表电流电压电阻表LCD1602

实践制作DIY- GC0149---蓝牙APP自动量程万用表 基于STM32单片机设计---蓝牙APP自动量程万用表 二、功能介绍&#xff1a; STM32F103C系列最小系统板LCD1602显示器模拟开关信号选择电路电压采集电路电流测量电路&#xff08;康铜丝采样&#xff09;电阻测量电路1个黑色公共端子…