【前端】1h 搞定 TypeScript 教程_只说重点

不定期更新,建议关注收藏点赞。


目录

  • 简介
  • 使用
    • 基本类型、类型推断和类型注解
    • 接口、类型别名、联合类型
    • 类与继承
    • 泛型Generics
    • React 与 TS
  • 进阶
    • 高级类型
    • 装饰器Decorators
    • 模块系统
    • TypeScript 编译选项

简介

TypeScript(简称 TS)是一种由微软开发的开源编程语言,是 JavaScript 的超集。在 JavaScript 的基础上增加了静态类型检查等其他功能,使得开发者可以在编写代码时更早地发现潜在的错误,从而提高代码的质量和可维护性。

“超集”是指一种包含原始语言或集合的语言或集合。
比如:如果 A 是 B 的超集,那意味着 A 包含了 B 的所有元素或特性,同时可能还额外包含一些元素或特性。
在 TypeScript 和 JavaScript 的关系中,TypeScript 是 JavaScript 的超集,表现为:
所有合法的 JavaScript 代码 都是有效的 TypeScript 代码,甚至可以直接运行。
TypeScript 在 JavaScript 的基础上添加了类型系统和其他一些功能(如类、接口等),因此 TypeScript 扩展了 JavaScript,提供了更多的特性,但依然保留了 JavaScript 的所有内容。

  • 作用:使JS更严谨可靠,提高质量和可维护性
  • 主要特点
    静态类型:TypeScript 允许你在编写代码时指定变量、函数参数、返回值等的类型。这样可以在编译阶段检查类型错误,避免了 JavaScript 动态类型的潜在问题。
    编译为 JavaScript:TypeScript 本身不能直接在浏览器中运行,必须先编译成 JavaScript 代码,而编译后的代码可以在所有支持 JavaScript 的环境中运行。
    面向对象编程支持:TypeScript 提供了类、接口、继承等面向对象编程的特性,让代码更加结构化。
    开发工具支持:TypeScript 提供了更强大的编辑器支持,比如自动完成、代码提示、跳转到定义等功能,可以提高开发效率。

使用

基本类型、类型推断和类型注解

  1. 基本类型
    TypeScript 的一大优势就是静态类型检查。最基础的是理解 TypeScript 的基本类型和如何使用它们。
    基本类型:
    number:用于表示数字类型。
    string:用于表示字符串类型。
    boolean:用于表示布尔值类型。
    null 和 undefined:表示空值和未定义的变量。
    any:任何类型,禁用类型检查,应该尽量避免使用。
    void:通常用于表示函数没有返回值。
  2. 类型推断:TypeScript 会根据变量的初始值来自动推断变量的类型。
let name = "John"; // 推断为 string
let age = 30; // 推断为 number
  1. 类型注解
    TypeScript 允许你显式指定变量、函数参数和返回值的类型,帮助提前发现错误。
//变量类型注解
let name: string = "Alice";
let age: number = 25;function greet(name: string): string {//函数类型注解return "Hello, " + name;
}

TypeScript 中的数组和元组支持类型注解。
元组是一种特殊的数组,允许存储不同类型的值,且长度固定。(注意区别python元组)

let numbers: number[] = [1, 2, 3];let tuple: [string, number] = ["Alice", 30];

接口、类型别名、联合类型

  1. 接口用于定义对象的结构,TypeScript 强烈推荐使用接口来描述对象类型。
//对象类型接口
interface Person {name: string;age: number;
}const person: Person = {name: "Alice",age: 30,
};//可选属性和只读属性
interface Person {name: string;age?: number;  // 可选属性readonly id: string; // 只读属性
}
  1. 类型别名 (Type Aliases)
    类型别名可以为类型提供一个新的名字,可以用于简化复杂类型或给已有类型起个更直观的名字。
type ID = string | number;function printId(id: ID): void {console.log(id);
}
  1. 联合类型 (Union Types)
    Union 类型允许一个变量或参数可以是多种类型之一。你可以使用 | 符号来定义联合类型。
function printId(id: string | number): void {console.log(id);
}printId(123);  // 合法
printId("abc"); // 合法

类与继承

TypeScript 提供了对面向对象编程(OOP,Object Oriented Programming)的良好支持,特别是类和继承。

//类和构造函数
class Person {name: string;age: number;constructor(name: string, age: number) {this.name = name;this.age = age;}greet(): string {return `Hello, I'm ${this.name}.`;}
}const person = new Person("Alice", 30);//继承
class Employee extends Person {role: string;constructor(name: string, age: number, role: string) {super(name, age);this.role = role;}describe(): string {return `${this.name} is a ${this.role}`;}
}const employee = new Employee("Bob", 25, "Developer");

泛型Generics

泛型,就是我不确定具体类型,先占个位,等用的时候再指定

  • 作用:泛型允许你定义能够处理多种类型的函数、接口和类,增强代码的复用性和类型安全。
function identity<T>(arg: T): T {return arg;
}

<T>:占位符,表示"某种类型",但暂时不知道是什么。
arg: T:这个参数是 T 类型。
: T:函数返回值也是 T 类型。

//函数
function identity<T>(arg: T): T {return arg;
}let result = identity<string>("Hello");//接口
interface Box<T> {value: T;
}
const box: Box<number> = { value: 123 };

React 与 TS

在 React 项目中,使用 TypeScript 能让你在处理状态、props、组件等方面更加得心应手,避免了类型错误。

项目老写法(React 16-17)新写法(React 18+)
import React必须写不用写了
用 React.FC常用不推荐,用 Props 明确写
useState/useEffect基本一致基本一致
  1. 不强制 import React 了
    因为从 React 17 新的 JSX 转换开始,编译器自己知道怎么处理 JSX,不需要手动 import。
//没有 import React from 'react',也不用 React.FC
interface Props {name: string;
}
//({ name }: Props)这个{name}是否解构props
//解构的话直接拿到 name,不需要 props.name,更方便。
const MyComponent = ({ name }: Props) => {return <h1>Hello, {name}!</h1>;
}
//未解构
const MyComponent = (props: Props) => {return <h1>Hello, {props.name}!</h1>;
}
  1. 很多人现在不推荐用 React.FC 来定义组件了
    原因:React.FC 会自动加上 children 属性,可能让类型不准确。写法麻烦。
  2. 没变化:useState 和 useEffect 的类型
  • useEffect 基本不用专门加类型,除非你需要在里面用复杂的异步处理。
  • useEffect 跟 useState 是完全不一样的设计
    useState —— 是泛型函数,因为它需要知道你存的数据类型是什么。
    useEffect —— 是普通函数,根本不需要泛型,因为它就是执行副作用(side effect),不是操作数据!
const [count, setCount] = useState<number>(0);
//useState<T>(initialValue) 给初始值加类型是非常标准的用法。
/*
返回值这里没有指定类型是因为
TypeScript 已经根据 useState<number>() 的返回类型,自动推导出来了
指定一次,后面全自动继承。
*/
function useState<T>(initialValue: T): [T, (newValue: T) => void] {let value = initialValue;function setValue(newValue: T) {value = newValue;console.log("新值:", value);}return [value, setValue];
}useEffect(() => {console.log("Component mounted");
}, []);

进阶

高级类型

(例如映射类型、条件类型等),这些通常出现在一些高难度的面试题和库的开发中。

装饰器Decorators

模块系统

在 TypeScript 中,模块和命名空间用于组织代码。模块通过 export 和 import 来进行模块化管理。

// file1.ts
export function greet(name: string) {return `Hello, ${name}!`;
}// file2.ts
import { greet } from './file1';console.log(greet("Alice"));
  • 命名空间(Namespace)
    用来组织代码的工具,给代码加一个盒子,防止名字冲突。
    比如:两个函数,名字都叫 sum,那肯定打架!放到不同的命名空间里面,就互不干扰了。
    命名空间是 老时代 TypeScript 管理代码的方法。现在更推荐用 模块(import/export)来组织代码。
namespace MathTools {
//加了 export,外面才能访问里面的函数,不然是私有的。export function sum(a: number, b: number): number {return a + b;}export function multiply(a: number, b: number): number {return a * b;}
}let result1 = MathTools.sum(1, 2);      // 3
let result2 = MathTools.multiply(3, 4); // 12

TypeScript 编译选项

深入理解 TypeScript 的编译器选项,优化项目的构建过程,特别是在大型应用中。

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

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

相关文章

MyBatis 参数绑定

一、MyBatis 参数绑定机制 1.1 核心概念 当 Mapper 接口方法接收多个参数时&#xff0c;MyBatis 提供三种参数绑定方式&#xff1a; 默认参数名&#xff1a;arg0、arg1&#xff08;Java 8&#xff09;或 param1、param2Param 注解&#xff1a;显式指定参数名称POJO/DTO 对象…

【解决方案】Linux解决CUDA安装过程中GCC版本不兼容

Linux解决CUDA安装过程中GCC版本不兼容 目录 问题描述 解决方法 安装后配置 问题描述 Linux环境下安装 CUDA 时&#xff0c;运行sudo sh cuda_10.2.89_440.33.01_linux.run命令出现 “Failed to verify gcc version.” 的报错&#xff0c;提示 GCC 版本不兼容&#xff0c;查…

人工智能数学基础(一):人工智能与数学

在人工智能领域&#xff0c;数学是不可或缺的基石。无论是算法的设计、模型的训练还是结果的评估&#xff0c;都离不开数学的支持。接下来&#xff0c;我将带大家深入了解人工智能数学基础&#xff0c;包括微积分、线性代数、概率论、数理统计和最优化理论&#xff0c;并通过 P…

Shell脚本-嵌套循环应用案例

在Shell脚本编程中&#xff0c;嵌套循环是一种强大的工具&#xff0c;可以用于处理复杂的任务和数据结构。通过在一个循环内部再嵌套另一个循环&#xff0c;我们可以实现对多维数组、矩阵操作、文件处理等多种高级功能。本文将通过几个实际的应用案例来展示如何使用嵌套循环解决…

勘破养生伪常识,开启科学养生新篇

​在养生潮流风起云涌的当下&#xff0c;各种养生观点和方法层出不穷。但其中有不少是缺乏科学依据的伪常识&#xff0c;若不加分辨地盲目跟从&#xff0c;不仅难以实现养生目的&#xff0c;还可能损害健康。因此&#xff0c;勘破这些养生伪常识&#xff0c;是迈向科学养生的关…

Nacos-3.0.0适配PostgreSQL数据库

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

机器学习第三篇 模型评估(交叉验证)

Sklearn:可以做数据预处理、分类、回归、聚类&#xff0c;不能做神经网络。原始的工具包文档&#xff1a;scikit-learn: machine learning in Python — scikit-learn 1.6.1 documentation数据集:使用的是MNIST手写数字识别技术&#xff0c;大小为70000&#xff0c;数据类型为7…

如何在 IntelliJ IDEA 中编写 Speak 程序

在当今数字化时代&#xff0c;语音交互技术越来越受到开发者的关注。如果你想在 IntelliJ IDEA&#xff08;一个强大的集成开发环境&#xff09;中编写一个语音交互&#xff08;Speak&#xff09;程序&#xff0c;那么本文将为你提供详细的步骤和指南。 一、环境准备 在开始编…

AI大模型学习十四、白嫖腾讯Cloud Studio AI环境 通过Ollama+Dify+DeepSeek构建生成式 AI 应用-接入DeepSeek大模型

一、说明 需要阅读 AI大模型学习十三、白嫖腾讯Cloud Studio AI环境 通过OllamaDifyDeepSeek构建生成式 AI 应用-安装-CSDN博客https://blog.csdn.net/jiangkp/article/details/147580344?spm1011.2415.3001.5331 我们今天干点啥呢&#xff0c;跟着官网走 模型类型 在 Dify…

《Astro 3.0岛屿架构让内容网站“脱胎换骨”》

内容优先的网站越来越成为主流。无论是新闻资讯、知识博客&#xff0c;还是电商产品展示&#xff0c;用户都希望能快速获取所需内容&#xff0c;这对网站的性能和体验提出了极高要求。而Astro 3.0的岛屿架构&#xff0c;就像是为内容优先网站量身定制的一把神奇钥匙&#xff0c…

在 UniApp 中实现 App 与 H5 页面的跳转及通信

在移动应用开发中&#xff0c;内嵌 H5 页面或与外部网页交互是常见需求。UniApp 作为跨平台框架&#xff0c;提供了灵活的方式实现 App 与 H5 的跳转和双向通信。本文将详细讲解实现方法&#xff0c;并提供可直接复用的代码示例。 文章目录 一、 App 内嵌 H5 页面&#xff08;使…

springboot 实现敏感信息脱敏

记录于2025年4月28号晚上--梧州少帅 1. 定义枚举类&#xff1a; public enum DesensitizeType {NAME, EMAIL } 2. 创建自定义注解&#xff1a; 用于标记需要脱敏的字段及其类型。 Retention(RetentionPolicy.RUNTIME) JacksonAnnotationsInside JsonSerialize(using Desen…

SNMP协议之详解(Detailed Explanation of SNMP Protocol)

SNMP协议之详解 一、前言 SNMP&#xff0c;被形象地喻为网络世界大的工具箱&#xff0c;使他们能的“智慧守护者”&#xff0c;它为网络管理员装备了一套功能强够实现对网络设备状态的实时监控、性能数据的全面收集、远程配置的灵活管理以及故障事件的即时响应。借助SNMP&…

SpeedyAutoLoot

SpeedyAutoLoot自动拾取插件 SpeedyAutoLoot.lua local AutoLoot CreateFrame(Frame)SpeedyAutoLootDB SpeedyAutoLootDB or {} SpeedyAutoLootDB.global SpeedyAutoLootDB.global or {}local BACKPACK_CONTAINER BACKPACK_CONTAINER local LOOT_SLOT_CURRENCY LOOT_SLOT…

xe-upload上传文件插件

1.xe-upload地址&#xff1a;文件选择、文件上传组件&#xff08;图片&#xff0c;视频&#xff0c;文件等&#xff09; - DCloud 插件市场 2.由于开发app要用到上传文件组件&#xff0c;uni.chooseFile在app上不兼容&#xff0c;所以找到了xe-upload&#xff0c;兼容性很强&a…

Golang|外观模式和具体逻辑

最终返回的是Document的切片&#xff0c;然后取得Bytes自己再去做反序列化拿到文档的各种详细信息。 外观模式是一种结构型设计模式&#xff0c;它的目的是为复杂的子系统提供一个统一的高层接口&#xff0c;让外部调用者&#xff08;客户端&#xff09;可以更简单地使用子系统…

2025年3月AGI技术月评|技术突破重构数字世界底层逻辑

〔更多精彩AI内容&#xff0c;尽在 「魔方AI空间」 &#xff0c;引领AIGC科技时代〕 本文作者&#xff1a;猫先生 ——当「无限照片」遇上「可控试穿」&#xff0c;我们正在见证怎样的智能革命&#xff1f; 被低估的进化&#xff1a;开源力量改写游戏规则 当巨头们在AGI赛道…

可解释人工智能(XAI):让机器决策透明化

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;AI 系统已经广泛应用于金融、医疗、交通等多个关键领域。然而&#xff0c;随着 AI 系统的复杂性不断增加&#xff0c;尤其是深度学习模型的广泛应用&#xff0c;AI 的“黑箱”问题逐渐凸显。AI 系统的决策过…

【Go语言】ORM(对象关系映射)库

github.com/jinzhu/gorm 是 Go 语言中一个非常流行的 ORM&#xff08;对象关系映射&#xff09;库&#xff0c;用于简化与关系型数据库的交互。以下是关于它的关键信息&#xff1a; 核心特点 全功能 ORM 支持主流数据库&#xff1a;MySQL、PostgreSQL、SQLite、SQL Server 等。…

大数据企业实验室管理的痛点 质检LIMS系统在大数据企业的应用

在数字化转型浪潮中&#xff0c;大数据企业正面临海量数据管理与质量控制的双重挑战。实验室作为数据生产的核心环节&#xff0c;其检测流程的规范化、数据处理的智能化直接关系到企业数据资产的可靠性。质检LIMS&#xff08;实验室信息管理系统&#xff09;通过整合实验室资源…