映射类型
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>;
如何在流程中定义这种类型?
答案 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 }