Typescript 映射类型 - 无法添加其他属性

Cri*_* E. 8 typescript

假设我有这样的类型定义:

name必须具有或fullname已定义财产的人

type Person = {
  [k in "name" | "fullname"]: string;
}; 
Run Code Online (Sandbox Code Playgroud)

假设我想再添加一个必需的属性age,直观上我会写这样的内容:

type Person = {
  [k in "name" | "fullname"]: string;
  age: number; // This errors
}; 
Run Code Online (Sandbox Code Playgroud)

然而,这种语法不起作用,唯一的方法是使用交集运算符,&如下所示:

type Person = {
  [k in "name" | "fullname"]: string;
} & { age: number }; 
Run Code Online (Sandbox Code Playgroud)

我是否遗漏了某些内容,或者交集是在映射类型之上定义此附加属性的唯一方法?

游乐场在这里

Cha*_*ase 9

type Person = {
  [k in "name" | "fullname"]: string;
}; 
Run Code Online (Sandbox Code Playgroud)

是一个映射类型。它是与对象文字类型不同的概念,您可以在对象文字类型中指定每个键的名称和类型。

也许您将映射类型与索引签名混淆了-

type Person = {
  [k in "name" | "fullname"]: string;
}; 
Run Code Online (Sandbox Code Playgroud)

不过,我认为这不是您想要的。您可以使用映射类型并与另一种类型相交,或者显式写出映射 -

type Person = {
  age: number;
  name: string;
  fullname: string;
};
Run Code Online (Sandbox Code Playgroud)