TypeScript (TS) 类型定义总结

news/2024/7/7 20:23:19

TypeScript (TS) 类型定义允许开发者为变量、函数参数、返回值等添加静态类型,这有助于提升代码的健壮性和可维护性。以下是一些使用TS类型定义的具体技巧及其例子:

1. 基础类型定义

基本类型如number, string, boolean等可以直接用于变量声明。

let age: number = 25;
let name: string = "Alice";
let isStudent: boolean = true;

2. 接口(Interface)用于对象形状约束

接口可以描述一个对象需要具备的结构。

interface User {
  id: number;
  name: string;
  email?: string; // 可选属性用问号标记
}

function printUserInfo(user: User) {
  console.log(`User ID: ${user.id}, Name: ${user.name}`);
}

const user1: User = { id: 1, name: "Bob" };
printUserInfo(user1);

3. 类型别名(Type Aliases)

类型别名可以给复杂类型起一个名字,提高代码可读性。

type StringOrNumber = string | number;

function combine(a: StringOrNumber, b: StringOrNumber): StringOrNumber {
  return a + b;
}

console.log(combine("Hello, ", "world")); // 输出: Hello, world
console.log(combine(1, 2)); // 输出: 3

4. 函数类型

明确函数参数和返回值的类型。

function add(x: number, y: number): number {
  return x + y;
}

const subtract: (a: number, b: number) => number = (a, b) => a - b;

5. 类的类型

定义类的结构和方法的类型。

class Person {
  constructor(public name: string, public age: number) {}
}

interface HasName {
  name: string;
}

function introduce(p: HasName) {
  console.log(`My name is ${p.name}.`);
}

introduce(new Person("Charlie", 30));

在这个例子中,Person类定义了一个具体的类型,它有两个公开属性:name和age。尽管Person类没有直接实现HasName接口,但是由于它的实例拥有name属性,因此可以被当作HasName类型使用。这里展示了类实例如何匹配一个接口描述的类型,体现了“类的类型”的概念:即类定义不仅用于实例化对象,其结构还定义了一种类型,可以用作类型检查和类型注解。

6. 泛型(Generic)

泛型让函数或类支持多种数据类型。

function identity<T>(arg: T): T {
  return arg;
}

console.log(identity<string>("Hello")); // 输出: Hello
console.log(identity<number>(100)); // 输出: 100

7. 可选参数和默认参数

函数参数可以是可选的,也可以设置默认值。

function greet(name: string, greeting?: string): string {
  if (!greeting) {
    greeting = "Hello";
  }
  return `${greeting}, ${name}!`;
}

console.log(greet("Alice")); // 输出: Hello, Alice!
console.log(greet("Bob", "Hi")); // 输出: Hi, Bob!

8. 映射类型(Map Types)

通过映射类型可以基于现有类型创建新类型。

type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};

interface Person {
  name: string;
  age: number;
}

type ReadonlyPerson = Readonly<Person>;

const person: ReadonlyPerson = { name: "David", age: 35 };
// person.name = "Eve"; // 错误,name是只读的

这些技巧展示了TypeScript类型系统的强大和灵活性,能够帮助开发者编写更安全、更易于维护的代码。


http://lihuaxi.xjx100.cn/news/2195904.html

相关文章

STM32智能小车学习笔记(避障、循迹、跟随)

我们使用的是STM32CubeMX软件和MDK5 芯片使用的是STM32F103C8T6 完成对STM32CubeMX的初始化后开始我们的第一步点亮一个LED灯 一、点亮LED灯 点亮PC13连接的灯 打开STM32CubeMX软件&#xff0c;pc13设置为输出模式 然后按照这样配置&#xff0c;user label 设置成这个IO口代…

鸿蒙emitter 订阅事件封装 EmitterUtils

适用于api11 和api12 废话不多说&#xff0c;直接上代码 import emitter from ohos.events.emitter; import { StringUtils } from ohos/flutter_ohos;export class EmitterUtils{/*** 发射字符串类型的* param eventId* param data*/public static sendEvent(eventId:stri…

OceanBase v4.2 特性解析:Lateral Derived Table 优化查询

前言 从传统规则来看&#xff0c;内联视图通常不允许引用在同一FROM子句中前面定义的表的列。但从OceanBase 4.2.2版本开始&#xff0c;这一限制得到了突破&#xff0c;允许内联视图作为Lateral Derived Table来定义&#xff0c;从而允许此类引用。Lateral Derived Table的语法…

Linux--标准IO库

一、标准IO简介 所谓标准 I/O 库则是标准 C 库中用于文件 I/O 操作&#xff08;譬如读文件、写文件等&#xff09;相关的一系列库函数的集合&#xff0c;通常标准 I/O 库函数相关的函数定义都在头文件 <stdio.h> 中&#xff0c;所以我们需要在程序源码中包含 <s…

优化你的WordPress网站:内链建设与Link Whisper Pro插件的利用

文章目录 内链的重要性WordPress SEO插件&#xff1a;Link Whisper Pro主要功能使用指南下载与安装 结语 在数字营销和网站管理领域&#xff0c;SEO内部优化是提升网站排名、增加流量和提高用户参与度的核心策略。在众多SEO技巧中&#xff0c;内链建设是构建良好网站结构和提升…

小炒 20240606

1 一些人做“人上人”的念头是从小就被植入到脑子里的&#xff0c;凡事都要和人比较&#xff0c;只有在比较中找到优越感&#xff0c;高人一头才能显得自己优秀。 比不上行内精英&#xff0c;就去和部门同事比&#xff0c;比不过同事&#xff0c;就去和亲戚、家人比&#xff…

【十大排序算法】冒泡排序

在排序的大海上&#xff0c;冒泡排序像一朵花朵般绽放&#xff0c; 每个元素都像是水珠&#xff0c;跃动在涟漪的波浪中。 它们轻轻上浮&#xff0c;与周围的元素相比较&#xff0c; 若自身更大&#xff0c;便悄然交换位置。 这是一场缓慢的舞蹈&#xff0c;每一步都小心翼翼&…

什么是领域模型(domain model)?贫血模型(anaemic domain model)和充血模型(rich domain model)有什么区别?

领域模型&#xff08;Domain Model&#xff09; 领域模型是软件工程中的一个概念&#xff0c;指的是在特定业务领域内&#xff0c;对现实世界中的实体、概念、业务规则和关系的抽象表达。它是应用程序设计的核心部分&#xff0c;用于指导软件系统的开发&#xff0c;并作为业务…