【问题标题】:Typescript, using classes without constructor打字稿,使用没有构造函数的类
【发布时间】:2018-06-08 08:20:43
【问题描述】:

在使用 Angular 网站上的“英雄之旅”教程时,我发现了以下语法(很快):

class Hero {
  id: number,
  name: string,
}

const aHero: Hero = {
  id: 1,
  name: 'Superman'
}

console.log(aHero instanceof Hero); //false

这样做有什么意义?当我检查“aHero”的类型时,它只是一个普通对象而不是“Hero”类型。用构造函数初始化一个对象会更好吗?:

class Hero {
  constructor(id: number, name: string) {}
}

【问题讨论】:

  • 好问题。答案是本教程提倡一种不好的做法。 Hero 应该是 interface
  • Todd Motto 有一个 great article 解释差异以及何时/为什么使用 interfaceclass
  • 你能用这段代码添加对这个部分的引用吗?
  • IMO 这对新手来说是一个非常糟糕的例子,已经在 github github.com/angular/angular/issues/21186 上报道过
  • 好地方!这是一种不好的做法——在这些情况下应该使用接口。

标签: javascript angular class typescript constructor


【解决方案1】:

您可以使用 class 作为类型,这就是您使用它的方式。因此,Hero 是接口还是类都无关紧要,因为您将它用作类型。

class Hero { id: number; name: string }

interface Hero { id: number; name: string }

以下不关心Hero是类还是接口

let hero: Hero = { id: 1, name: 'me' }

interfaceclass 的区别在于 interface 仅供您使用,它不会被转译成 javascript。 class 可以,而您不能 newinterface

构造函数或没有构造函数,如果你new 它那么它是一个instanceof。用这个再试一次

let hero = new Hero();

您的instanceof 日志将为true,因为您确实使用关键字new 创建了Hero 实例。

【讨论】:

    【解决方案2】:

    我知道这个问题之前已经回答过了,但就面向对象的代码而言,它总是这样。

    我相信你可以在没有构造函数的情况下做到这一点:

    let hero: Hero = { ID: 1, Name: 'goku'};
    

    但是如果你想用构造函数实例化你可以在类中这样做

    class Hero
    {
        //notice optional parameters. You have more flexibility this way.
        constructor(id?: number, name?: string)
        {  
          this.ID = id;
          this.Name = name;
        }
    
        ID: number;
        Name: string
    }
    

    并通过实现来做到这一点

    let hero: Hero = new Hero(1,'goku');
    let hero2: Hero = { ID: 2, Name: 'superman' }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-29
      • 2018-10-16
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      相关资源
      最近更新 更多