繁体   English   中英

我可以增量构建实现接口的 object 吗?

[英]Can I incrementally build an object that implements an interface?

我有一个接口,如:

export interface Person {
  name: string;
  isMillenial: boolean;
}

还有一个 function 输出该接口,如:

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
}

但是,这将失败,并出现如下错误:

“{ name: string }”类型中缺少属性“isMillenial”,但在“Person”类型中是必需的。

我知道我可以在创建newPerson时声明它的所有属性,以符合预期 - 但我想构建我正在逐步创建的 object,添加属性直到 object 完成。 有没有办法可以在 TypeScript 中逐步构建 object,同时仍然满足类型检查?

(如果答案是“不,你需要默认值”,这是一个可以接受的答案)

是的,但是您必须以不同的方式声明它,并且您可能必须在完成 object 后告诉 TypeScript。 Partial实用程序类型基于另一种类型创建一个类型,该类型的所有属性都是可选的。 所以:

function makePerson(name: string, birthYear: number): Person {
    let newPerson: Partial<Person> = {
    // −−−−−−−−−−−−^^^^^^^^^^^^^^^
        name
    };

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

    return newPerson as Person;
    // −−−−−−−−−−−−−−^^^^^^^^^
}

遗憾的是,最后的类型断言是必要的(这让我感到惊讶,你可以从上面看出这两个属性最终都不会undefined ,但是 TypeScript 团队必须限制编译器的智能程度以防止它被真的很慢)。

游乐场链接

返回的as Person还意味着您可以根据需要将其从 function 声明签名中删除,TypeScript 将知道 function 的返回类型:

function makePerson(name: string, birthYear: number): Person {
// Optional as far as TypeScript is concerned −−−−−−^^^^^^^^

...尽管如果 function 多于几行,您可能希望将其保留在那里,以确保您不会在其他地方添加新的return ,从而更改返回类型。


您在问题中提到了它,但我会强调它的价值(和潜伏者),您可以建立您将用于创建 object 的信息,然后一次创建 object 以保存需要类型注释。 这大大简化了这个例子,当然真正的代码可能不会变得更简单:

function makePerson(name: string, birthYear: number): Person {
    const isMillenial = birthYear < 1981;
    return {name, isMillenial};
}

这并不总是可行的,但是当它可行时,我发现它很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM