【愚公系列】《鸿蒙原生应用开发从零基础到多实战》002-TypeScript 类型系统详解

news/2025/2/23 6:27:16
标题详情
作者简介愚公搬代码
头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。
近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。
博客内容.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
欢迎👍点赞、✍评论、⭐收藏

文章目录

  • 🚀前言
  • 🚀一、TypeScript 类型系统详解
    • 🔎1.基础类型定义
    • 🔎2.任意值(Any)
    • 🔎3.联合类型
    • 🔎4.数组类型定义
      • 🦋4.1 类型 + 方括号
      • 🦋4.2 泛型数组(`Array<T>`)
      • 🦋4.3 任意类型数组
    • 🔎5.对象的类型——接口(Interfaces)
      • 🦋5.1 基本接口
      • 🦋5.2 可选属性
      • 🦋5.3 任意属性
    • 🔎6.函数的类型定义
      • 🦋6.1 基础函数类型
      • 🦋6.2 参数默认值
      • 🦋6.3 可选参数
      • 🦋6.4 类型别名
    • 🔎7.总结


🚀前言

🚀一、TypeScript 类型系统详解

🔎1.基础类型定义

语法格式:变量名: 类型 = 值

类型示例说明
布尔类型let flag: boolean = false;仅接受 true/false
数值类型let num: number = 15;支持整数、浮点数、二进制等
字符串类型let str: string = "abc";支持单引号、双引号、模板字符串
模板字符串let msg = `hello, ${str}, ${num}`;使用反引号拼接变量
null/undefinedlet u: undefined = undefined;
let n: null = null;
需显式声明类型
typescript">let flag:boolean = false; //布尔类型
let num:number = 15; //数值类型
let str:string = 'abc'; //字符串类型
let str2:string=`hello,${str}`;
let msg:string = `hello,${str},${num}`;
let u: undefined = undefined;
let n: null = null;

🔎2.任意值(Any)

特点:允许赋值为任意类型,关闭类型检查。

typescript">let a1: string = 'seven';
a1 = 7;//error
但如果是 any 类型,则允许被赋值为任意类型。
let a2: any = 'seven';
a2 = 7;
变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型
let a3;
a3 = 'seven';
a3 = 7;
相当于
let a3:any;
a3 = 'seven';
a3 = 7;

注意事项:滥用 any 会丧失类型安全,应谨慎使用。

🔎3.联合类型

定义:变量可以是多种类型中的一种,用 | 分隔。

typescript">let a4: string | number;
a4 = "seven"; // 合法
a4 = 7;       // 合法
a4 = true;    // 报错:不能赋值给联合类型

联合类型的限制
只能访问共有属性或方法:

typescript">function getLength(str: string | number): number {
  return str.length; // 报错:number 没有 length 属性
}

解决方法:类型断言或类型保护。

typescript">// 类型断言(明确告知类型)
function getLength(str: string | number[]): number {
  return (str as number[]).length; // 断言为数组
}

// 类型保护(运行时检查)
function getLength(str: string | number[]): number {
  if (Array.isArray(str)) {
    return str.length; // 合法
  }
  return str.length;   // 报错:number 没有 length
}

🔎4.数组类型定义

🦋4.1 类型 + 方括号

typescript">let arr: number[] = [1, 2, 3]; // 仅允许数值
let arrError: number[] = [1, "2", 3]; // 报错:包含字符串

🦋4.2 泛型数组(Array<T>

typescript">let arrGeneric: Array<number> = [1, 2, 3];
let arrMultiType: Array<number | string> = ["1", 2, 3];

泛型优势:支持更灵活的类型组合,适用于复杂数据结构。

🦋4.3 任意类型数组

typescript">let arrAny: any[] = [1, "1", true, { id: 1 }]; // 允许任意类型

🔎5.对象的类型——接口(Interfaces)

🦋5.1 基本接口

typescript">interface Person {
  name: string;
  age: number;
}

let tom: Person = { 
  name: "Tom", 
  age: 18 
}; // 合法

let tomError: Person = { 
  name: "Tom" 
}; // 报错:缺少 age 属性

🦋5.2 可选属性

typescript">interface Person2 {
  name: string;
  age?: number; // 可选属性
}

let tom4: Person2 = { 
  name: "Tom" 
}; // 合法

🦋5.3 任意属性

typescript">interface Person3 {
  name: string;
  age?: number;
  [propName: string]: any; // 允许任意额外属性
}

let tom6: Person3 = { 
  name: "Tom", 
  sex: "男" 
}; // 合法

关键规则:
一旦定义任意属性,其他属性的类型必须是其子类型。
例如,若 [propName: string]: string,则 age: number 会报错。

🔎6.函数的类型定义

🦋6.1 基础函数类型

typescript">function sum(x: number, y: number): number {
  return x + y;
}

🦋6.2 参数默认值

typescript">function sum3(x: number = 5, y: number): number {
  return x + y;
}

sum3(undefined, 2); // x 使用默认值 5

注意:默认参数应放在参数列表末尾,否则需显式传 undefined

🦋6.3 可选参数

typescript">function sum4(x: number, y?: number): number[] {
  return [x, y];
}

sum4(1); // 返回 [1, undefined]

规则:可选参数必须位于必选参数之后。

🦋6.4 类型别名

typescript">function myHello(person: n) {
       return 'Hello, ' + person;
};
type n = number;
let name:n = 18;
console.log(myHello(name));

🔎7.总结

特性核心要点
类型注解明确变量类型,增强代码可读性和安全性。
联合类型通过 `
泛型数组使用 Array<T> 提高灵活性,适用于复杂数据。
接口约束对象形状,支持可选属性和任意属性,需注意类型兼容性。
函数类型参数类型、返回值类型、可选参数和默认值的组合使用。

避坑指南:

  1. 联合类型方法调用:确保访问的属性是所有类型的共有属性。
  2. 接口任意属性:定义后,其他属性必须兼容任意属性的类型。
  3. 函数默认参数:默认参数应放在参数列表末尾,避免调用时歧义。

http://www.niftyadmin.cn/n/5863115.html

相关文章

LeetCode51

LeetCode51 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结 题目描述 N 皇后问题&#xff1a;将 n 个皇后放置在 n x n 的棋盘上&#xff0c;使得皇后彼此之间不能相互攻击&#xff08;即任何两个皇后不能在同一行、同一列或同一斜线上&#x…

Docker教程(喂饭级!)

如果你有跨平台开发的需求&#xff0c;或者对每次在新机器上部署项目感到头疼&#xff0c;那么 Docker 是你的理想选择&#xff01;Docker 通过容器化技术将应用程序与其运行环境隔离&#xff0c;实现快速部署和跨平台支持&#xff0c;极大地简化了开发和部署流程。本文详细介绍…

线代[8]|北大丘维声教授《怎样学习线性代数?》(红色字体为博主注释)

文章目录 说明一、线性代数的内容简介二、学习线性代数的用处三、线性代数的特点四、学习线性代数的方法五、更新时间记录 说明 文章中红色字体为博主敲录完丘教授这篇文章后所加&#xff0c;刷到这篇文章的读者在首次阅读应当跳过红色字体&#xff0c;先通读一读文章全文&…

深度学习之特征提取

前言 深度学习就是把输入转换成一个高维的向量&#xff0c;之后利用这个向量去完成分类、回归等任务。 深度学习特征工程知识图谱 1. 特征提取的本质 核心目标&#xff1a;将原始数据→高维语义特征向量 监督驱动&#xff1a;标签决定特征提取方向 典型架构&#xff1a; …

Javascript排序算法(冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序)详解

JS 排序算法详解 排序算法是计算机科学中的基础&#xff0c;用于将一组数据按照某种顺序重新排列。JavaScript中常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。以下是这些算法的详细介绍和代码示例。 冒泡排序&#xff08;Bubble Sort&#xff09;…

GPIO外设

一、GPIO简介 GPIO&#xff0c;general-purpos IO port,通用输入输出引脚&#xff0c;所有的GPIO引脚都有基本的输入输出功能。 最基本的输出功能&#xff1a;STM32控制引脚输出高、低电平&#xff0c;实现开关控制&#xff1b;最基本的输入功能&#xff1a;检测外部输入电平&…

CDGA|企业数据治理实战:从疏通“信息河”到打造优质“数据湖”

在当今的数字化时代&#xff0c;数据已成为企业的重要资产&#xff0c;其价值不言而喻。然而&#xff0c;面对海量的数据&#xff0c;如何进行有效的治理&#xff0c;将其转化为企业的竞争优势&#xff0c;成为了众多企业面临的难题。本文将深入探讨企业数据治理的实战策略&…

[实现Rpc] 服务端 | RpcRouter实现 | Builder模式

目录 项目服务端独用类的实现 1. RpcRouter类的实现 ServiceDescribe SDescribeFactory ⭕ Builder模式 1. 动机 2. 模式定义 3. 要点总结 4. 代码感受 ServiceManager RpcRouter 4. 代码感受 ServiceManager RpcRouter 前文我们就将 Rpc 通用类都实现完啦&#…