首页 > 其他分享 >TypeScript第三章

TypeScript第三章

时间:2023-08-11 10:37:07浏览次数:37  
标签:TypeScript 第三章 name 示例 Person sayHello 泛型 log

TypeScript 是一个由微软开发的开源编程语言,它是 JavaScript 的超集,意味着 TypeScript 包含了 JavaScript 的所有特性,同时还提供了一些新的特性和语法糖。TypeScript 可以帮助开发者在开发大型应用时提高代码可维护性、可读性和可靠性。本文将介绍 TypeScript 的一些进阶使用方法,并且提供代码示例。

一、使用泛型

泛型是 TypeScript 中的一种强类型机制,它可以让我们在编写代码时,不需要提前确定数据类型,而是在使用时才指定数据类型。这种机制可以提高代码的灵活性和可复用性。

下面是一个简单的泛型示例:

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

let output = identity<string>("hello world");
console.log(output);

这个示例中,identity 函数使用了泛型 T,并且将参数 arg 和返回值都指定为 T 类型。在调用函数时,我们可以使用 <string> 来指定 T 的类型为字符串。

二、使用类型别名和接口

类型别名和接口都是 TypeScript 中用于定义类型的机制。它们可以让我们在编写代码时,更加清晰地指定类型,提高代码的可读性和可维护性。

类型别名可以用来给一个类型起一个新的名字,例如:

type MyString = string;
let myString: MyString = "hello world";

接口可以用来描述一个对象的属性和方法,例如:

interface Person {
  name: string;
  age: number;
  sayHello: () => void;
}

let person: Person = {
  name: "Tom",
  age: 18,
  sayHello: function() {
    console.log("Hello, my name is " + this.name);
  }
}
三、使用装饰器

装饰器是 TypeScript 中一个非常强大的特性,它可以让我们在编写代码时,对类、方法、属性等进行注解和修饰。使用装饰器可以提高代码的可读性和可维护性,同时也可以实现一些高级的功能,例如日志记录、性能监控、权限控制等。

下面是一个简单的装饰器示例:

function log(target: any, name: string, descriptor: PropertyDescriptor) {
  const originalMethod = descriptor.value;

  descriptor.value = function(...args: any[]) {
    console.log(`[${new Date().toISOString()}] ${name}(${args})`);
    return originalMethod.apply(this, args);
  };

  return descriptor;
}

class MyClass {
  @log
  myMethod(arg1: string, arg2: number) {
    console.log("myMethod is called with " + arg1 + " and " + arg2);
  }
}

let myClass = new MyClass();
myClass.myMethod("hello", 123);

这个示例中,我们定义了一个 log 装饰器,它会在 myMethod 方法被调用时,输出日志信息。在 MyClass 类中,我们使用 @log 装饰器来修饰 myMethod 方法。

四、使用命名空间

命名空间是 TypeScript 中一种将代码组织成模块化结构的机制。使用命名空间可以避免命名冲突,提高代码的可维护性和可重用性。

下面是一个简单的命名空间示例:

namespace MyNamespace {
  export interface Person {
    name: string;
    age: number;
  }

  export function sayHello(person: Person) {
    console.log(`Hello, my name is ${person.name} and I'm ${person.age} years old.`);
  }
}

let person: MyNamespace.Person = { name: "Tom", age: 18 };
MyNamespace.sayHello(person);

这个示例中,我们使用命名空间 MyNamespace 来定义了一个 Person 接口和一个 sayHello 函数,并且使用 export 关键字将它们暴露出来。在调用时,我们可以使用 MyNamespace.Person 来指定 Person 类型,使用 MyNamespace.sayHello 来调用函数。

五、使用模块化

与命名空间不同,模块化是一种更加先进、更加强大的组织代码结构的机制。使用模块化可以将代码分成多个文件,并且能够更好地管理依赖关系,提高代码的可维护性和可重用性。

下面是一个简单的模块化示例:

在 Person.ts 文件中:

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

在 Hello.ts 文件中:

import { Person } from "./Person";

export function sayHello(person: Person) {
  console.log(`Hello, my name is ${person.name} and I'm ${person.age} years old.`);
}

在 Main.ts 文件中:

import { Person } from "./Person";
import { sayHello } from "./Hello";

let person: Person = { name: "Tom", age: 18 };
sayHello(person);

这个示例中,我们将 Person 接口定义在 Person.ts 文件中,并使用 export 关键字将其暴露出来。在 Hello.ts 文件中,我们使用 import 关键字来引入 Person 接口,并且定义了一个 sayHello 函数。在 Main.ts 文件中,我们使用 import 关键字来引入 Person 接口和 sayHello 函数,并且使用它们来进行调用。

六、使用泛型约束

泛型约束是 TypeScript 中一种使用类型约束泛型参数的机制。使用泛型约束可以避免出现不符合预期的数据类型,提高代码的可靠性和可维护性。

下面是一个简单的泛型约束示例:

interface Lengthwise {
  length: number;
}

function logLength<T extends Lengthwise>(arg: T): void {
  console.log(`The length of '${arg}' is ${arg.length}.`);
}

logLength("hello world");
logLength([1, 2, 3]);
logLength({ length: 5 });
logLength(123); // error: Argument of type '123' is not assignable to parameter of type 'Lengthwise'.

这个示例中,我们定义了一个 Lengthwise 接口,它包含了一个 length 属性。在 logLength 函数中,我们使用了泛型约束 T extends Lengthwise,它表示泛型参数 T 必须符合 Lengthwise 接口的要求。在调用函数时,我们可以传递字符串、数组、对象等符合要求的参数,但是如果传递一个不符合要求的参数,就会发生编译错误。

标签:TypeScript,第三章,name,示例,Person,sayHello,泛型,log
From: https://blog.51cto.com/u_16171861/7044021

相关文章

  • typeScript学习-TS类型-其他特殊类型-any、unknown
    typeScript学习其他特殊类型:any,unknown,never,void,元组(tuple),可变元组 any比较经典的应用场景:1、自定义守卫2、需要进行asany类型断言的场景unknown一般用作函数参数:用来接收任意类型的变量实参,但在函数内部只用于再次传递或输出结果,不获......
  • typeScript学习-TS类型-其他特殊类型-never
    typeScript学习其他特殊类型:any,unknown,never,void,元组(tuple),可变元组never://dataFlowAnalysisWithNever方法穷尽了DataFlow的所有可能类型。//使用never避免出现未来扩展新的类没有对应类型的实现,目的就是写出类型绝对安全的代码。typeDataFlow=stri......
  • typeScript学习-TS类型-合成类型
    typeScript学习合成类型:联合类型,交叉类型联合类型:letstr:srting|number="abc"str=3交叉类型:typeObj1={username:string}typeObj2={age:number}letobj:Obj1={username:'zhangsan'}letobj2:Obj2={age:23}letobj3:Obj1&Obj2={username:&#......
  • typeScript学习-TS类型-字面量数据类型
    typeScript学习字面量数据类型://typeA=number|string//leta:A="abc"//typenum=number//letn:num=3typenum=1|2|3letn:num=2//错误情况//letn:num=4typeincreaseFlag=0|1functionisStartUp(increase:increaseFlag){if(in......
  • typeScript学习-TS类型-枚举
    typeScript学习枚举:enum枚举的定义:用来存放一组固定的常量的序列。枚举带来的好处:1、有默认值和可以自增值,节省编码时间2、语义更清晰,可读性增强,因为枚举是一种值类型的数据类型,方法参数可以明确参数类型为枚举类型enumWeekEnd{Monday="myMonday",//......
  • typeScript学习-TS类型-接口
    typeScript学习接口:定义:另一种定义对象类型的类型接口应用场景:1、一些第三方包或者框架底层源码中有大量的接口类型2、提供方法的对象类型的参数时使用3、为多个同类别的类提供统一的方法和属性声明如何定义接口:继承接口:新的接口只是在原来接口集成之上增加......
  • .NET5从零基础到精通:全面掌握.NET5开发技能【第三章】
    章节第一章:https://www.cnblogs.com/kimiliucn/p/17613434.html第二章:https://www.cnblogs.com/kimiliucn/p/17620153.html第三章:https://www.cnblogs.com/kimiliucn/p/17620159.html十三、权限验证13.1-基于Seesion/Cookies的权限认证为了拦截一些操作:传统的授权方式:S......
  • 使用 WebSockets、React 和 TypeScript 构建实时投票应用程序
    长话短说WebSocket允许您的应用程序具有“实时”功能,其中更新是即时的,因为它们是在开放的双向通道上传递的。这与CRUD应用程序不同,CRUD应用程序通常使用HTTP请求,必须建立连接、发送请求、接收响应,然后关闭连接。要在React应用程序中使用WebSockets,您需要一个专用服务器,例......
  • TypeScript中使用数组的filter方法
    constarr:string[]=['pom','皮蛋编程','非常厉害','太棒了'];constfilteredArr:string[]=arr.filter((str:string)=>{returnstr.includes('编程');});console.log(filteredArr);//["皮蛋编程"] ar......
  • typeScript学习-类型注解、类型推导
    typeScript学习类型注解声明时定义变量固定类型letdata:number=3data=4interfaceStudent{ name:string, age:number} letstuObj ={name:25,age:'zhangsan'} 类型推导声明时候没有定义变量类型,在赋值时定义的变量类型letdata=3......