代码之家  ›  专栏  ›  技术社区  ›  Fred Hors

在用Typescript创建新对象时,有没有办法避免所有未定义的字段?

  •  0
  • Fred Hors  · 技术社区  · 4 年前

    我有那种 Player :

    type Player = {
      id: Scalars['ID'];
      name: Scalars["String"];
      age: Scalars["Int"];
      description?: Maybe<Scalars["String"]>;
      __typename?: "Player";
      // ... and dozens and dozens of other fields here ...
    };
    

    现在我需要添加 游戏者 在现有阵列中:

    let players: Player[] = [];
    
    players = [...players, newPlayer()]
    
    function newPlayer() {
      return {
        id: newID(),
        name: undefined,
        age: undefined,
        description: undefined,
        // ... and so on dozens and dozens ...
      }
    }
    

    我只需要设置 newID() 在新播放器中。在这种情况下,所有其他领域对我来说都是无用的。

    有没有办法避免所有 undefined 中的字段 newPlayer() ?

    1 回复  |  直到 4 年前
        1
  •  1
  •   ByungYong Kang    4 年前

    试试这个,

    let players: Player[] = [];
    
    players = [...players, newPlayer()]
    
    function newPlayer(): Player {
      return {
        id: newID(),
      } as Player;
    }
    

    只要将类型强制转换为Player,就不需要设置所有不必要的属性。并且访问播放器属性的语法是有效的。

    console.log(players[0].id, players[0].name);
    
        2
  •  1
  •   Dimitri L.    4 年前

    在这种情况下,所有其他领域对我来说都是无用的。

    如果字段是可选的,那么只需相应地设置类型,并为函数设置适当的返回类型

    type Player = {
      id: Scalars['ID'];
      name?: Scalars["String"];
      age?: Scalars["Int"];
      // ...
    };
    
    function newPlayer(): Player {
    

    如果您定义了一些类型,但希望在代码中使用不同的东西,那么就没有理由使用typescript。如果您实际上只想从 newPlayer 函数,并为其进行适当的键入,您可以使用 Pick utility type

    function newPlayer(): Pick<Player, 'id'> {
    
    推荐文章