当前位置: 首页 > news >正文

TypeScript入门学习

1.变量声明

let声明的变量可以被重新赋值。

const声明的变量则需要在声明时初始化,并且之后不能被重新赋值。

let msg: string = 'hello world';
let age: number = 21;
let isDone: boolean = true;

2.数据类型

string:字符串类型,可以使用单引号或双引号。
number:数值类型,包括整数和浮点数,也支持二进制、八进制和十六进制表示。
boolean:布尔类型,只有true和false两个值。
any:任意类型,可以是任何类型,使用时不进行类型检查。
void:表示没有返回值或未指定类型。
null 和 undefined:分别表示空值和未定义值。
never:表示永远不会有值的类型,通常用于函数永远不会返回或抛出错误的场景。
object:对象类型,用于表示非原始类型(即不是string、number、boolean、symbol、null或undefined)。
array:数组类型,可以使用泛型来指定数组元素的类型。例如:let names: string[] = ['Jack', 'Rose']; 或者 let numbers: Array<number> = [1, 2, 3];。
tuple:元组类型,表示一个已知元素数量和类型的数组。例如:let tuple: [number, string, boolean] = [1, 'two', true];。
enum:枚举类型,用于定义一组命名的常量。例如:enum Status { Pending, Resolved, Rejected }。

3.条件控制

TypeScript支持基于if-elseswitch的条件控制语句。例如:

let num: number = 21;
if (num % 2 === 0) {console.log(num + '是偶数');
} else {console.log(num + '是奇数');
}let grade: string = 'A';
switch (grade) {case 'A':console.log('优秀');break;case 'B':console.log('合格');break;case 'C':console.log('不合格');break;default:console.log('非法输入');break;
}

4.循环迭代

TypeScript支持forwhile循环,并且为一些内置类型如Array等提供了快捷迭代语法。例如:

// 普通for循环
for (let i = 1; i <= 10; i++) {console.log('点赞' + i + '次');
}// while循环
let j = 1;
while (j <= 10) {console.log('点赞' + j + '次');j++;
}// 数组迭代
let names: string[] = ['Jack', 'Rose'];
for (const name of names) {console.log(name);
}

5.函数

TypeScript使用function关键字来声明函数,支持可选参数、默认参数、箭头函数等特殊语法。例如:

// 无返回值函数
function sayHello(name: string): void {console.log('你好,' + name + '!');
}// 有返回值函数
function sum(x: number, y: number): number {return x + y;
}// 箭头函数
let sayHi = (name: string) => {console.log('你好,' + name + '!');
};// 可选参数函数
function greet(name: string, message?: string): void {console.log('Hello, ' + (message ? message + ', ' : '') + name + '!');
}// 默认参数函数
function greetWithDefault(name: string, message: string = 'How are you?'): void {console.log('Hello, ' + message + ', ' + name + '!');
}

6.接口和类

TypeScript具备面向对象编程的基本语法,例如interface、class、enum等,也具备封装、继承、多态等面向对象基本特征。

接口(Interface):用于定义一个对象的结构,可以包含属性、方法的声明。接口可以被类实现(implements)。
类(Class):用于描述一类具体事物的抽象特征,可以包含属性、方法、构造函数等。类可以实现接口,也可以继承其他类。

// 定义接口
interface Person {name: string;age: number;greet(): void;
}// 实现接口的类
class Student implements Person {name: string;age: number;constructor(name: string, age: number) {this.name = name;this.age = age;}greet(): void {console.log('Hello, my name is ' + this.name + ' and I am ' + this.age + ' years old.');}
}

7.类型推断与类型注解

类型推断:TypeScript具有类型推断的能力,即可以根据变量的使用上下文推断出其类型。例如,当声明一个变量let x = 10;时,TypeScript会推断出x的类型为number。
类型注解:为了更加明确地告诉TypeScript变量的类型,可以使用类型注解。例如,let y: string = "hello";就显式地指定了y的类型为string。

8.接口

接口是TypeScript中的一个核心概念,用于描述对象的形状。通过接口,可以定义对象应该包含哪些属性以及这些属性的类型。例如:

interface Person {name: string;age: number;
}let person: Person = { name: "Alice", age: 30 };

9.联合类型与交叉类型

  • 联合类型:表示一个值可以是多种类型之一。例如,let value: string | number = "hello";表示value可以是string类型或number类型。
  • 交叉类型:将多个类型合并为一个新的类型。例如,type Admin = Employee & Manager;表示Admin类型同时拥有EmployeeManager类型的属性。

10.类型守卫

类型守卫是一种特定的函数,可以在运行时检查变量的类型,并返回一个布尔值来指示变量是否符合特定类型。类型守卫有助于在编译时捕获类型错误,提高代码的安全性。例如

function isString(value: unknown): value is string {return typeof value === 'string';
}function processValue(value: unknown) {if (isString(value)) {console.log(value.toUpperCase());} else {console.log((value as number) * 2);}
}

11.泛型

泛型是现代编程语言中非常重要的特性之一,它允许函数、接口、类等组件在定义时不指定具体的类型,而是在使用时再确定具体的类型。泛型能够编写出更加灵活且可重用的代码,同时保持类型安全。例如:

function identity<T>(arg: T): T {return arg;
}let output1 = identity<string>("Hello World"); // output1 的类型是 string
let output2 = identity<number>(123); // output2 的类型是 number

12.类型别名

type UserID = string;
let id1: UserID = "abc123";
let id2: UserID = "xyz456";

13.类型断言

类型断言允许开发者在编译时明确指定一个值的类型,即使TypeScript无法自动推断出这个类型。类型断言不会改变变量的运行时值,而只是告诉编译器如何理解这个值。类型断言有两种语法:尖括号语法和as语法。例如:

let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length; // 尖括号语法
let strLength2: number = (someValue as string).length; // as 语法

14.装饰器

装饰器是一种特殊类型的声明,它可以被附加到类声明、方法、访问器、属性或参数上,从而在不修改原始类定义的情况下,动态地修改或增强类和类成员的功能。装饰器在运行时被调用,接收一些特定的参数(如目标类的构造函数、属性描述符等),并返回一个修改后的版本或者原始版本。例如:

function logClz(value: any, constructor: any) {console.log(`create a instance of ${constructor.name}`);
}@logClz
class Student {constructor() {console.log('Student constructor called');}
}const stone = new Student(); // 输出: create a instance of Student
http://www.dtcms.com/a/485998.html

相关文章:

  • 西固网站建设平台12306网站花多少钱做的
  • Linux运维实战:云原生设计与实施DockerK8S(视频教程)
  • Chroma 开源的 AI 应用搜索与检索数据库(即向量数据库)
  • 楼宇自控 DDC 系统 + IBMS 智能化集成系统:构建建筑智慧运营双核心
  • 《深度学习框架核心之争:PyTorch动态图与早期TensorFlow静态图的底层逻辑与实战对比》
  • 固件下printf函数分析
  • 做外贸都得有网站吗秦皇岛网站排名公司
  • AI-Native 能力反思(三):Prompt Engineering 自我提升神器
  • 基于Django+Vue2+MySQL前后端分离的红色故事分享平台
  • LangGraph 工作流全解析:从 Prompt 到智能体编排的革命
  • JAVA算法练习题day42
  • 天津市建设工程备案网站什么是网站的层次
  • 【基础算法】BFS
  • 国家工信部网站备案查询系统公司网址怎么做出来的
  • 做网站都用到哪些软件asp源码打开网站
  • React组件生命周期节点触发时机(组件加载Mount、组件更新Update、组件卸载Unmount)组件挂载
  • 月球矩阵日志:Swift 6.2 主线程隔离抉择(上)
  • 无需 iCloud 在 iPhone 之间传输文本消息
  • Flink受管状态自定义序列化原理深度解析与实践指南
  • Unity Visual Graph粒子系统 Plexus 效果
  • 淘宝里网站建设公司可以吗无经验能做sem专员
  • seo技术秋蝉河北网站优化建设
  • C++微服务 UserServer 设计与实现
  • 设计模式篇之 迭代器模式 Iterator
  • Spring MVC 多租户架构与数据隔离教程
  • MySQL数据库如何实现主从复制
  • 如何在 Docker 中设置环境变量 ?
  • 【C++】STL容器--list的使用
  • 【深度学习计算机视觉】12:风格迁移
  • 网站到期可以续费织梦安装网站后图片