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?];
相关推荐
平头哥~1 小时前
Day 07 _ 那条 1px 的线,为什么在手机上忽粗忽细
前端·css·样式·学习资料
小江的记录本2 小时前
【CSS】CSS 动画:transition、animation、transform、CSS3 新特性(附《思维导图》)
前端·css·安全·spring·前端框架·css3·动画
circuitsosk2 小时前
任务规划器的三种范式对比:ReAct、Plan-and-Execute 与 Tree-of-Thought 在真实业务中的取舍
前端·javascript·python·react.js·llm·ai agent
hzxpaipai3 小时前
企业官网技术架构拆解:前端、后台、数据库、服务器如何协同
前端·数据库·架构
深念Y5 小时前
Lenovo XiaoXinAir 14 — 性能模式切换
前端·网络
计算机魔术师5 小时前
Meta突然杀进第一梯队:一个新模型,把AI推理成本打下来8倍
前端
IT_陈寒6 小时前
Redis缓存雪崩把我坑惨了,这次长记性了
前端·人工智能·后端
风骏时光牛马6 小时前
提示词工程:大模型效能挖掘与指令设计实战
前端
仓三6 小时前
Chrome DevTools MCP 上手:让 Coding Agent 自己调试前端页面
前端·chrome devtools·mcp