Ts支持哪些类型和类型运算(上)

目录

1、元组

2、接口(interface)

3、枚举(Enum)

4、字面量类型

5、keyof

[6、in keyof](#6、in keyof "#6%E3%80%81in%20keyof")

7、类型的装饰


静态类型系统 就是把 类型检查从运行时提前到了编译时,所以ts类型系统中的许多类型与js并无区别

例如:

基本类型: number、boolean、string、object、bigint、symbol、undefined、null

复合类型方面,JSclass、Array,这些 TypeScript 类型系统也都支持,但是又多加了三种类型:元组(Tuple)、接口(Interface)、枚举(Enum)。

1、元组

说明:元素个数和类型固定的数组类型

ts 复制代码
type Tuple = [string,number]

2、接口(interface)

说明:用来描述对象、函数、构造器结构

ts 复制代码
//函数
interface MyPerson {
 name: string;
 age: number;
}

const obj: MyPerson = {
 name: "张三",
 age: 18,
};

class Person implements MyPerson {
 name: "小乔";
 age: 18;
}

这里我们声明了 一个 名为 MyPerson 的接口 其中有两个属性 1-name 2-age 他们对应的类型为stringnumber

obj对象应用了这个接口,所以obj中必须要有name、age这两个字段且类型必须与MyPerson相互对应

implements译为实现 代码中 Person类实现了MyPerson接口,具体表达的意思与obj相同

ts 复制代码
// 函数类型
interface SayGood {
    (name: string): string;
}

const sayGood: SayGood = (name: string) => {
    return   name + 'is good'
}

这里我们声明了 一个 名为 SayGood 的接口描述了一个函数,接受一个name为参数类型是 string 函数的返回值为string

ts 复制代码
// 构造函数
interface MyPerson {
    name: string;
    age: number;
}

/**
 * 该接口描述了一个构造函数
 * 该构造函数接受两个参数(name 和 age),并返回一个 MyPerson 类型的实例。
 */
interface PersonConstructor {
    new (name: string, age: number): MyPerson;
}

/**
 * @description: 接受一个 PersonConstructor 类型的参数,返回一个 MyPerson 类型
 * @param {PersonConstructor} ctor
 * @return {MyPerson}
 */
function createPerson(ctor: PersonConstructor):MyPerson {
    return new ctor('shmily', 18);
}

对象类型、class在ts中也叫索引类型,对象可以动态添加属性,如果不知道会有什么属性,可以使用索引签名

ts 复制代码
interface MyPerson {
    [prop: string]: string | number;
}
const obj:MyPerson = {};
obj.name = 'shmily';
obj.age = 18;

3、枚举(Enum)

说明:一系列值的集合

ts 复制代码
enum API {
  a = "/api/a",
  b = "/api/b",
  c = "/api/c",
  d = "/api/d",
}

const res = API.a; ///  /api/a

4、字面量类型

字面类型有两种,第一次为普通的字符串字面量例如'aaa',另一种为模板字面量比如 #${string}

他的意思是以#开头后面为任意的string类型

编辑

还有四种特殊的类型:void、never、any、unknown

  • never 为不可达,比如函数抛异常的时候,返回值就是 never。

  • void 为空,可以是 undefined 或 never。

  • any 为任意类型,任何类型都可以赋值给它,它也可以赋值给任何类型(除了 never)。

  • unknown 为未知类型,任何类型都可以赋值给它,但是它不可以赋值给别的类型。

5、keyof

ts 复制代码
type Person = {
  id: number;
  name: string;
  age: number;
};

type P1 = keyof Person; //'id' | 'name' | 'age'

keyof操作符得到的是Person类型的所有键值类型即 'id','name''age' 三个字面量类型 组成的联合类型'id' | 'name' | 'age'

6、in keyof

ts 复制代码
type Person = {
  id: number;
  name: string;
  age: number;
};

type P1 = keyof Person; //'id' | 'name' | 'age'
type MyPick<T, K extends keyof T> = { [P in K]: T[P] };
type P3 = MyPick<Person, "id">;

说明:便利对象并拿到所有的键

  1. K extends keyof TK进行了约束,只能是'id','name','age'中的一个类型或者几个类型组成的联合类型;

  2. 如果没有这个约束,{ [P in K]: T[P] } 则会报错。

  3. 最后 我们传入的id可以拿到对应的类型

试一试

7、类型的装饰

ts类型系统还支持 添加 类型的属性 比如 可选、只读

ts 复制代码
interface MyPerson {
    readonly name: string; //只读
    age?: number;  //可选
}

type tuple = [string, number?];
相关推荐
陈卓41032 分钟前
Redis-限流方案
前端·redis·bootstrap
顾林海40 分钟前
Flutter Dart 运算符全面解析
android·前端
七月丶1 小时前
🚀 现代 Web 开发:如何优雅地管理前端版本信息?
前端
漫步云端的码农1 小时前
Three.js场景渲染优化
前端·性能优化·three.js
悬炫1 小时前
赋能大模型:ant-design系列组件的文档知识库搭建
前端·ai 编程
用户108386386801 小时前
95%开发者不知道的调试黑科技:Apipost让WebSocket开发效率翻倍的秘密
前端·后端
稀土君1 小时前
👏 用idea传递无限可能!AI FOR CODE挑战赛「创意赛道」作品提交指南
前端·人工智能·trae
OpenTiny社区1 小时前
Node.js 技术原理分析系列 4—— 使用 Chrome DevTools 分析 Node.js 性能问题
前端·开源·node.js·opentiny
写不出代码真君2 小时前
Proxy和defineProperty
前端·javascript
乐坏小陈2 小时前
TypeScript 和 JavaScript:2025 年应该选择哪一个?【转载】
前端·javascript