温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

typescript如何使用映射类型

发布时间:2022-03-19 11:13:28 阅读:246 作者:小新 栏目:开发技术
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这篇文章主要介绍了typescript如何使用映射类型,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

映射类型

在了解映射类型之前,需要了解 keyof, never, typeof, in。

keyof:keyof 取 interface 的键

interface Point {
    xnumber;
    ynumber;
}

// type keys = "x" | "y"
type keys = keyof Point;

never:永远不存在的值的类型

官方描述:

the never type represents the type of values that never occur.

// 例子:进行编译时的全面的检查
type Foo = string | number;

function controlFlowAnalysisWithNever(foo: Foo) {
  if (typeof foo === "string") {
    // 这里 foo 被收窄为 string 类型
  } else if (typeof foo === "number") {
    // 这里 foo 被收窄为 number 类型
  } else {
    // foo 在这里是 never
    const checknever = foo;
  }
}

使用 never 避免出现新增了联合类型没有对应的实现,目的就是写出类型绝对安全的代码。

typeof:取某个值的 type

const anumber = 3

// 相当于: const b: number = 4
const btypeof a = 4

in:检查一个对象上是否存在一个属性

interface A {
  x: number;
}

interface B {
  y: string;
}

function doStuff(q: A | B{
  if ('x' in q) {
    // q: A
  } else {
    // q: B
  }
}

映射类型就是将一个类型映射成另外一个类型,简单理解就是新类型以相同的形式去转换旧类型的每个属性。

Partial, Readonly, Nullable, Required

  • Partial 将每个属性转换为可选属性

  • Readonly 将每个属性转换为只读属性

  • Nullable 转换为旧类型和null的联合类型

  • Required 将每个属性转换为必选属性

type Partial<T> = {
    [P in keyof T]?: T[P];
}

type Readonly<T> = {
    readonly [P in keyof T]: T[P];
}

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

type Required<T> = {
  [P in keyof T]-?: T[P]
}

interface Person {
    namestring;
    agenumber;
}

type PersonPartial = Partial<Person>;
type PersonReadonly = Readonly<Person>;
type PersonNullable = Nullable<Person>;

type PersonPartial = {
    name?: string | undefined;
    age?: number | undefined;
}

type PersonReadonly = {
    readonly namestring;
    readonly agenumber;
}

type PersonNullable = {
      namestring | null;
      agenumber | null;
}

interface Props {
  a?: number;
  b?: string;
}

const objProps = { a5 };

const obj2Required<Props> = { a5 };
// Property 'b' is missing in type '{ a: number; }' but required in type 'Required<Props>'.

Pick, Record

  • Pick 选取一组属性指定新类型

  • Record 创建一组属性指定新类型,常用来声明普通Object对象

type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
}

type Record<K extends keyof any, T> = {
  [P in K]: T;
}

interface Todo {
  titlestring;
  descriptionstring;
  completedboolean;
}

type TodoPreview = Pick<Todo"title" | "completed">;

const todoTodoPreview = {
  title"Clean room",
  completedfalse,
};

todo; // = const todo: TodoPreview


interface PageInfo {
  titlestring;
}

type Page = "home" | "about" | "contact";

const navRecord<PagePageInfo> = {
  about: { title"title1" },
  contact: { title"title2" },
  home: { title"title3" },
};

nav.about// = const nav: Record

Exclude, Omit

  • Exclude 去除交集,返回剩余的部分

  • Omit 适用于键值对对象的Exclude,去除类型中包含的键值对

type Exclude<T, U> = T extends U ? never : T
type Omit = Pick<T, Exclude<keyof T, K>>

// 相当于: type A = 'a'
type A = Exclude<'x' | 'a''x' | 'y' | 'z'>

interface Todo {
  titlestring;
  descriptionstring;
  completedboolean;
}

type TodoPreview = Omit<Todo"description">;

const todoTodoPreview = {
  title"a",
  completedfalse,
};

ReturnType

获取返回值类型,一般为函数

type ReturnType<T extends (...argsany) => any>
  = T extends (...argsany) => infer R ? R : any;

declare function f1(): { anumberbstring };
type T1 = ReturnType<typeof f1>;
//    type T1 = {
//        a: number;
//        b: string;
//    }

感谢你能够认真阅读完这篇文章,希望小编分享的“typescript如何使用映射类型”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×