如何在typescript中定义的流中定义映射类型

时间:2018-02-09 05:03:57

标签: typescript flowtype

映射类型

https://www.typescriptlang.org/docs/handbook/advanced-types.html

一个常见的任务是获取现有类型并使其每个属性都是可选的:

interface PersonPartial {
    name?: string;
    age?: number;
}

或者我们可能想要一个只读版本:

interface PersonReadonly {
    readonly name: string;
    readonly age: number;
}

这在Javascript中经常发生,TypeScript提供了一种基于旧类型创建新类型的方法 - 映射类型。在映射类型中,新类型以相同的方式转换旧类型中的每个属性。例如,您可以将类型的所有属性设置为只读或可选。以下是几个例子:

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

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

使用它:

type PersonPartial = Partial<Person>;
type ReadonlyPerson = Readonly<Person>;

如何在流程中定义这种类型?

1 个答案:

答案 0 :(得分:2)

对于readonly,有$ReadOnly utility type。值得注意的是,对于嵌套对象,这不会递归地起作用。它也不会改变每一个都是可选的面部,这是有道理的,因为你只需设置一次并说你无法改变它。

interface PersonPartial {
  name?: string;
  age?: number;
}

type ReadOnly = $ReadOnly<PersonPartial>

为了使事物可选而不是只读,你可以将readonly传播到一个新类型:

interface PersonReadOnly {
  +name: string,
  +age: number
}

type PartialPerson = { ...PersonReadOnly }

这里有try flow所有这一切。

你总是可以让自己拥有实现这些的类型。因此,如果您想要Partial类型,则可以:

type Partial<O: {}> = { ...O }