Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 我可以增量构建一个实现接口的对象吗?_Typescript_Interface - Fatal编程技术网

Typescript 我可以增量构建一个实现接口的对象吗?

Typescript 我可以增量构建一个实现接口的对象吗?,typescript,interface,Typescript,Interface,我有这样一个界面: export interface Person { name: string; isMillenial: boolean; } function makePerson(name: string, birthYear: number): Person { let newPerson = { name } // Calculate various properties, slowly building up the `newPerson` obje

我有这样一个界面:

export interface Person {
  name: string;
  isMillenial: boolean;
}
function makePerson(name: string, birthYear: number): Person {
  let newPerson = {
    name
  }

  // Calculate various properties, slowly building up the `newPerson` object
  newPerson.isMillenial = birthYear < 1981

  return newPerson
}
以及输出该接口的函数,如:

export interface Person {
  name: string;
  isMillenial: boolean;
}
function makePerson(name: string, birthYear: number): Person {
  let newPerson = {
    name
  }

  // Calculate various properties, slowly building up the `newPerson` object
  newPerson.isMillenial = birthYear < 1981

  return newPerson
}
函数makePerson(姓名:string,生日:number):Person{
让newPerson={
名称
}
//计算各种属性,慢慢建立“newPerson”对象
newPerson.ismilenial=出生年份<1981年
返回新人
}
但是,这将失败,并出现如下错误:

类型“{name:string}”中缺少属性“isMillenial”,但类型“Person”中需要该属性

我知道我可以在创建时声明
newPerson
的所有属性,以符合预期-但是我希望以增量方式构建我正在创建的对象,添加属性直到对象完成。是否有一种方法可以在满足类型检查的同时,在TypeScript中增量构建对象


(如果答案是“否,您需要默认设置”,这是一个可接受的答案)

是的,但您必须以不同的方式声明它,并且您可能必须在完成对象时告诉TypeScript。基于另一个类型创建一个类型,该类型使其所有属性都是可选的。因此:

函数makePerson(姓名:string,生日:number):Person{
让newPerson:Partial={
// −−−−−−−−−−−−^^^^^^^^^^^^^^^
名称
};
//计算各种属性,慢慢建立“newPerson”对象
newPerson.Ismilenial=出生年份<1981年;
将新人作为人返回;
// −−−−−−−−−−−−−−^^^^^^^^^
}
遗憾的是,最后的类型断言是必要的(这让我很惊讶,从上面可以看出,到最后,两个属性都不会是未定义的,但是TypeScript团队必须限制编译器的智能程度,以防止它变得非常慢)

返回上的
as Person
也意味着您可以不使用函数声明签名,如果您愿意,TypeScript将知道函数的返回类型:

函数makePerson(姓名:string,生日:number):Person{
//就类型脚本而言是可选的−−−−−−^^^^^^^^
…尽管如果函数超过几行,您可能希望将其保留在那里,以确保您不会在其他地方添加新的
return
,从而更改返回类型


您在问题中提到了它,但我要强调的是,您可以建立用于创建对象的信息,然后一次性创建对象,以节省需要的类型注释。这将简化示例,当然实际代码可能不会变得更简单:

函数makePerson(姓名:string,生日:number):Person{
const Ismilenial=出生年份<1981年;
返回{name,isMillenial};
}
这并不总是可行的,但如果可行的话,我觉得它很有用