Skip to content

2 #91

@fantasticit

Description

@fantasticit

extends

  1. 接口继承
interface T1 {
  name: string;
}

interface T2 {
  age: number;
}

interface T3 extends T1, T2 {
  sex: string;
}
  1. 条件判断
interface Animal {
  eat(): void;
}

interface Dog extends Animal {
  bite(): void;
}

// 如果前面的类型可以赋值给后面的类型,则为 true
type A = Dog extends Animal ? string : number; // string
  1. 泛型用法
type A1 = 'x' extends 'x' ? string : number; // string
type A2 = 'x' | 'y' extnds 'x' ? string : number; // number

type P<T> = T extends 'x' ? string : number;
type A3 = P<'x' | 'y'>; // string | number; 满足分配律,被拆开赋值,type A3 = 'x' extends 'x' | 'y' extends 'x'

type A4 = never extends 'x' ? string : number; // string
type P1<T> = T extends 'x' ? string : number;
type A5 = P1<never>; // never,在条件分配类型中 never 被认为是空的联合类型

type P2<T> = [T] extends ['x'] ? string : number; // 通过 [] 阻止条件分配类型
type A6 = P2<"x" | 'y'>; // number
type A7 = P2<never>; // string,never 被认为是所有类型的子类型


type Exclude<T, U> = T extends U ? never : T;
type B = Exclude<'key1' | 'key2', "key2"> // 相当于 type B = Exclude<key1, key2> | Exclude<key2, key2>

type Extract<T, U> = T extends U ? T : never;
type C = Extract<'key1' | 'key2', 'key2'> // 相当于 type C = Extract<key1, key2> | Extract<key2, key2>

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

type vs interface

  1. 都可以用于描述对象或方法签名,语法不同
interface Point {
  x: number;
  y: number;
}

interface SetPoint {
  (x: number, y: number): void;
}

type Point = {
  x: number;
  y: number;
};

type SetPoint = (x: number, y: number) => void;
  1. type 可以用作其他 type 的类型别名,interface 不可以
type Name = string;

type X = { x: number };
type Y = { y: number };
type Z = X | Y;

type D = [X, Y];
  1. 都可以进行扩展,且可以互相扩展
interface X {
  x: number;
}

interface Point extends X {
  y: number;
}

-----

type X = { x: number };
type Point = X & { y: number };

----

interface X {
  x: number;
}
type Point = X & { y: number };

----

type X = { x: number };
interface Point extends X {
  y: number;
}
  1. interface 声明会被合并
interface Point {
  x: number;
}

interface Point {
  y: number;
}

const p: Point = { x: 0, y: 0 };

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions