首页 > 其他分享 >HOW - Typescript 常用特性介绍

HOW - Typescript 常用特性介绍

时间:2024-04-03 12:31:29浏览次数:128  
标签:Typescript name age 特性 HOW 类型 interface any string

目录

一、目标

首先,要编写出色的 TypeScript 代码,请遵循以下最佳实践和技巧:

  1. 学习基础知识:确保熟悉 TypeScript 的基本概念,例如类型、接口、类、模块和泛型。
  2. 使用强类型:尽可能为变量、函数参数和返回类型指定明确的类型。这有助于提高代码的可读性和可维护性。
  3. 使用接口:通过接口来定义复杂的数据结构和约定。这可以确保对象遵循预期的结构,并有助于提供更清晰的代码文档。
  4. 使用泛型:在编写可复用的函数和类时,使用泛型可以让您的代码更灵活、类型安全。
  5. 利用类型推断:TypeScript 能够根据上下文自动推断变量的类型。在某些情况下,可以省略类型注解,让代码更简洁。
  6. 使用类型守卫和类型断言:在处理不同类型的值时,使用类型守卫和类型断言可以确保代码在运行时具有正确的类型。
  7. 使用模块化:将代码分解为模块,并使用 import 和 export 语句来组织代码。这有助于代码的可读性和可维护性。

遵循这些建议和技巧,您将能够编写出高质量、可维护且易于理解的 TypeScript 代码。

二、常用特性介绍

any vs unknown

anyunknown 都是 TypeScript 中的顶级类型,但它们有不同的行为和用途。

  1. any 类型:
    • any 类型表示任意类型,它可以接受任何类型的值,不进行类型检查和推断。
    • 使用 any 类型会关闭 TypeScript 的类型检查机制,因此不推荐在代码中滥用 any 类型。
    • 使用 any 类型会降低代码的类型安全性,因为 TypeScript 不会对 any 类型进行类型检查,可能会导致运行时错误。
let value: any;
value = 123; // 合法
value = 'hello'; // 合法
value = true; // 合法
// 可以对 value 进行任意操作,编译器不会报错
  1. unknown 类型:
    • unknown 类型表示未知类型,它可以接受任何类型的值,但 TypeScript 不会自动对其进行类型检查和推断。
    • any 类型不同,使用 unknown 类型时,TypeScript 会强制我们在使用之前对其进行类型检查或类型断言。
    • 使用 unknown 类型可以在不放弃类型安全性的前提下,处理不确定类型的值。
let value: unknown;
value = 123; // 合法
value = 'hello'; // 合法
value = true; // 合法
// 使用 unknown 类型时,必须在使用之前进行类型检查或类型断言
if (typeof value === 'string') {
   
    console.log(value.toUpperCase()); // 合法
}

总的来说,unknown 类型比 any 类型更安全,因为它强制我们在使用之前对值进行类型检查,从而提高了代码的类型安全性。在实际开发中,应尽量避免使用 any 类型,而是使用更加严格的类型,如 unknown 类型。

type vs interface

在 TypeScript 中,typeinterface 都可以用来定义类型。

尽管它们有很多相似之处,但它们在某些方面也有一些不同,这使得它们在不同的使用场景中更加适用。

让我们来看一下它们的用途以及它们之间的区别。

  1. interface:主要用于定义对象类型

interface 是 TypeScript 中最常用的定义类型的方式。它主要用于定义对象类型,可以表示类、函数、对象字面量等的形状(shape)

具有以下特点:

  1. 可以被实现(implements)。
  2. 可以扩展(extends)。
  3. 可以合并声明(同名接口可以合并成一个接口)。
  4. 可以用于描述索引(index)签名。索引签名用于表示一个对象的索引操作。
  5. 可以用于描述构造签名。构造签名用于表示一个类的构造函数。
// 1. 可以被实现
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() {
   
    console.log(`Hello, my name is ${
     this.name} and I'm ${
     this.age} years old.`);
  }
}

// 2. 可以被继承
interface Employee extends Person {
   
  title: string;
}

// 3. 可以合并声明
interface Box {
   
    height: number;
    width: number;
}
interface Box {
   
    scale: number;
}
let box: Box = {
    height: 5, width: 6, scale: 10 };

// 4. 可以用于描述索引签名
interface StringDictionary {
   
  [key: string]: string;
}
const dictionary: StringDictionary = {
   
  hello: "world",
  foo: "bar",
};
console.log(dictionary["hello"]); // Output: world
console.log(dictionary["foo"]); // Output: bar

// 5. 可以用于描述构造签名
interface Person {
   
  name: string;
  age: number;
  greet(): void;
}
interface PersonConstructor {
   
  new (name: string, age: number): Person; // 构造签名
}
const createPerson = (ctor: PersonConstructor, name: string, age: number): Person => {
   
  return new ctor(name, age);
};
class Student implements Person {
   
  constructor(public name: string, public age: number) {
   }
  greet() {
   
    console.log(`Hello, my name is ${
     this.name} and I'm ${
     this.age} years old.`);
  }
}
const person = createPerson(Student, "Alice", 30);
person.greet(); // Output: Hello, my name is Alice and I'm 30 years old.
  1. type:表示任何类型

type 是一个更通用的类型别名,可以表示任何类型。除了对象类型外,type 还可以表示基本类型、联合类型、交叉类型、映射类型等。

具有以下特点:

  1. 支持更多的类型操作,例如条件类型映射类型等。
  2. 可以表示非对象类型,例如基本类型联合类型交叉类型等。
  3. 不能被实现或扩展,但可以使用交叉类型进行组合
  4. 可以使用 = 进行类型别名。
// 1. 支持条件类型
type IsString<T> = T extends string ? 

标签:Typescript,name,age,特性,HOW,类型,interface,any,string
From: https://blog.csdn.net/weixin_58540586/article/details/137277665

相关文章

  • [Pytest 02] How to write and report assertions in tests -How to Guidances
    AssertwiththeassertstatementAssertionsaboutexpectedexceptionsAssertionsaboutexpectedwarningsMakinguseofcontext-sensitivecomparisonsDefiningyourownexplanationforfailedassertionsAssertionintrospectiondetailsAssertionrewritingca......
  • Java常用新特性之方法引用
    1.举例:Comparator<Integer>com3=Integer::compare;2.方法引用的理解给接口提供实现类的对象,我们可以使用匿名实现类的对象的方式。在此基础上,如果发现此接口是一个函数式接口,则给此接口提供实现类的对象,此时就一定可以使用lambda表达式在此基础上,如果满足某个条件,......
  • TS(TypeScript)— 搭建开发环境
    1.创建pakeage.jsonnpminit//自选参数npminit-y//默认参数 2.构造目录安装ts开发依赖npminstalltypescripttslint-g创建功能文件夹 初始化ts(安装typescript就可以使用tsc命令)生成tsconfig.json文件tsc--init 配置webpacknpminstallwe......
  • Java常用新特性之“构造器引用”和“数组引用”
    1.构造器引用1.1格式:类名::new1.2说明:构造器引用在执行时,会调用指定的类的构造器,创建其对象。具体调用的是哪个形参列表的构造器呢?取决于函数式接口的抽象方法的形参列表。此抽象方法的形参列表与要调用的构造器的形参列表相同。调用指定构造器后,创建的对象作为......
  • CTFshow pwn49 wp
    PWN49用ida打开我们发现是静态编译的,所以先要通过libc库来打是不可能的了,程序里面有一个栈溢出点,找一下有没有system函数,发现并没有那么我们找一下有没有mprotect函数如果有这个那么我们可以把一段地址改成可读可写可执行权限,然后写入我们的shellcode就可以执行了,发现确实有这......
  • Eureka vs. Nacos:注册中心角色之间的不同特性
    此文章简要介绍一下Eureka和Nacos在注册中心功能上规则、功能的不同服务拉取机制这一部分内容我们可以引入两个远程调用最初的问题来引入消费者如何得知提供者信息,包括url,健康状态等?当程序并发量大,提供者以集群部署时,应该如何选择?根据此二问题,衍生出了服务拉取等环节(服......
  • Elasticsearch各个版本重要特性
    Elasticsearch各个版本重要特性Elasticsearch5Elasticsearch6.0Elasticsearch7.0Elasticsearch8.0Elasticsearch5首先说明下,ES是从版本2直接跳到5的,主要是为了和ElasticStack其他组件保持版本一致ES5,在现在来说是比较老的版本了,就不多介绍了建议大家使用ES7,或者直接使用ES8E......
  • How to fix: “inotify cannot be used, reverting to polling: Too many open files
    Youareherebecauseyouhadencounteredtheerrorinthetitle.InthisarticleIwillexplaintheerrorandstepsnecessarytoreproduceandfixit.Themostrelevantdocumentationforinotifyisthe inotifymanpage, thatyoucanalsoreadlocallywith......
  • 前端开发中Vue3+Typescript使用装饰器出现错误一则
    今天开发公司项目时,使用TS装饰器遇到一个问题。当我写完装饰器代码后进入网页,控制台提示SyntaxError:Invalidorunexpectedtoken两个小时后的排查后发现是tsconfig.json的配置问题。如果tsconfig.json文件中没有指定target选项,TypeScript编译器会默认使用es5作......
  • ES2020新特性
    ES2020新特性ES2020已经发布了,一共出9个新特性,下面让我们一起来了解下。String.prototype.matchAll()可一次性取出所有匹配,但是返回的是一个遍历器(Iterator),而非数组。可以用forof循环取出。相对于返回数组,返回遍历器的好处在于,如果遍历结果是一个很大的数组,那么遍历器比较节......