【前端】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.pswp.cn/news/903282.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903282.shtml
英文地址,請注明出處:http://en.pswp.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;通過整合實驗室資源…