是否可以从部分类型生成严格类型?

iwa*_*303 7 typescript typescript2.1

我们可以从严格类型生成部分类型,如下所示(来自TypeScript 2.1):

type Partial<T> = {
    [P in keyof T]?: T[P];
};
type Person = { name: string, age: number } 
type PersonPartial = Partial<Person>; // === { name?: string, age?: number }
Run Code Online (Sandbox Code Playgroud)

相反,是否有可能从部分类型生成严格类型?

type Strict<T> = { ??? };

type Person = { name: string; age?: number; }
type PersonStrict = Strict<Person>; // === { name: string, age: number }
Run Code Online (Sandbox Code Playgroud)

我真正想要的是什么

我需要2种以下类型,但不想写两次.

type Person = { name: string, age?: number, /* and other props */ }
type PersonStrict = { name: string, age: number, /* and other props */ }
Run Code Online (Sandbox Code Playgroud)

我找到了如下所示的详细解决方案,但我想知道有更好的方法.

type RequiredProps = { name: string, /* and other required props */ };
type OptionalProps = { age: number, /* and other optional props */ };
type Person = RequiredProps & Partial<OptionalProps>;
type PersonStrict = RequiredProps & OptionalProps;
Run Code Online (Sandbox Code Playgroud)

Edu*_*ard 5

使用必需类型。

type Person = { name: string; age?: number; }
type RequiredPerson = Required<Person>; // === { name: string, age: number }
Run Code Online (Sandbox Code Playgroud)


iwa*_*303 1

我找到了做到这一点的方法。

type Person = { name: string, age?: number };
type Strict<T> = { [K in (keyof T)]: T[K] };
type PersonStrict = Strict<Person>;
Run Code Online (Sandbox Code Playgroud)

附加的括号keyof T是强制性的。

如果没有这些括号,age仍然是可选的。