[TypeScript] Transform Existing Types Using Mapped Types in TypeScript

Mapped types are a powerful and unique feature of TypeScript's type system. They allow you to create a new type by transforming all properties of an existing type according to a given transformation function. In this lesson, we'll cover mapped types like Readonly<T> or Partial<T> that ship with the TypeScript compiler, and we'll also explore how to create our own type transformations.

 

There are few mapped types built-in:

复制代码
/**
 * Make all properties in T optional
 */
type Partial<T> = {
    [P in keyof T]?: T[P];
};

/**
 * Make all properties in T readonly
 */
type Readonly<T> = {
    readonly [P in keyof T]: T[P];
};

/**
 * From T pick a set of properties K
 */
type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
};

/**
 * Construct a type with a set of properties K of type T
 */
type Record<K extends string, T> = {
    [P in K]: T;
};
复制代码

 

Take readonly as an example, the output is like this:

复制代码

interface Point {
   x: number;
   y: number;
}

ReadonlyPoint = Readonly<Point>;

type ReadonlyPoint = { readonly x: number; readonly y: number; }
复制代码

So for each props in Point, we append 'readonly' type for it.

 

The way type resolve:

复制代码
interface Point {
    x: number;
    y: number;
}

// From
type ReadonlyPoint = {
    readonly [P in keyof Point]: Point[P]
}

type ReadonlyPoint = {
    readonly [P in "x" | "y"]: Point[P]
}

type ReadonlyPoint = {
    readonly x: Point["x"];
    readonly y: Point["y"];
}

// To
type ReadonlyPoint = {
    readonly x: number
    readonly y: number;
}
复制代码

 

The same process can be done with Partial type:

复制代码
type PartialPoint = Partial<Point>;

// From
type PartialPoint = {
    [P in keyof T]?: T[P];
}

type PartialPoint = {
    [P in keyof Point]?: Point[P];
}

type PartialPoint = {
    [P in "x" | "y"]?: Point[P];
}

type PartialPoint = {
    x?: Point["x"];
    y?: Point["y"];
}

// To
type PartialPoint = {
    x?: number;
    y?: number;
}
复制代码

 

We can also write Nullable type by ourselves:

type Nullable<T> = {
   [P in keyof T]: T[P] | null
}

For each Prop fo Type T, it can be its value or null.

 

We can also combine different type together:

复制代码
type Nullable<T> = {
    [P in keyof T]: T[P] | null
}

type Stringify<T> = {
    [P in keyof T]: string
}

type NullablePoint = Nullable<Point>
type PartialNullablePoint = Partial<Nullable<Stringify<Point>>>
复制代码

 

posted @   Zhentiw  阅读(336)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2016-09-21 [Angular 2] Nesting Elements in Angular 2 Components with ng-content (AKA Angular 2 Transclusion)
2016-09-21 [Angular 2] Style Angular 2 Components
点击右上角即可分享
微信分享提示