【问题标题】:What is the best way to create an object out of interface in typescript在打字稿中从接口创建对象的最佳方法是什么
【发布时间】:2018-03-02 23:01:33
【问题描述】:

我已经使用 typescript 1 年了,每次我需要一个对象通过时,我都需要以丑陋的方式或手动完成。

在 typescript 中有用于类型定义的接口,并包含我们需要的所有参数。有没有办法可以从中创建对象?

示例:

export interface User {
  name: string;
  email: string;
}

我希望下面的代码是自动化的,我无法从接口评估器中做到这一点我已经创建了一个带有构造函数的类。

user {
 name: ''/null/undefined,
 email: ''/null/undefined
}

let user: User = new User() // this will show error

但我可以从下面的类中创建一个新对象。

export class User {
  constructor() {
    name: string;
    email: string;
  }
}

new User();

哪个是击球手?创建构造函数类或接口?

【问题讨论】:

  • “我希望代码自动化”是什么意思?你想直接给接口赋值而不创建实现类吗?
  • 是的。这可能吗?
  • 您也可以使用对象文字语法创建它:let user: User = { name: '', email: '' };。显然,您是唯一可以确定哪个更好的人,因为您是抱怨正常完成方式的人。
  • 这样我就知道了。还有其他方法吗?如果我的界面中有 30 个属性,我需要全部编写。正如我的界面中的所有内容一样,有没有一种方法可以让我写一些更简单的东西,而不是像let user: User = { name: '', email: '' .........};

标签: typescript typescript-typings


【解决方案1】:

我认为没有办法。

接口和类是两个不同的东西,有不同的用例。接口只是结构,不能有实例,你会看到编译后的 typescript 生成的 JavaScript,你不会在任何地方找到接口。

所以接口只在编译时而不是运行时。

但是这些类是运行时的。因此,当您说 new User() 时,它会创建该类的实例,就像它在生成的 JavaScript 中一样。

如果它适合您的情况,您也可以探索抽象类。

【讨论】:

    【解决方案2】:

    是的,如果您不需要分配/实例化接口中定义的所有属性,则可以直接为接口分配值,并且可以通过其外观将其标记为可选使用?。在下面的示例电子邮件中,被标记为可选并且用户的后续分配将是一个有效的语句。

    interface User {
      name: string;
      email?: string;
    }
    
    let user: User = { name: '' };
    

    【讨论】:

    • 我的问题不一样!我正在尝试从接口而不是可选参数中创建对象
    【解决方案3】:

    你可以这样做:

    export interface IMyInterface {
      property1: string;
      property2: number;
      property3: boolean;
    }
    
    export class MyClass {
      property1: string = '';
      property2: number = 1;
      property3: boolean = false;
      constructor(){}
    }
    

    然后实例化:

    let newFromInterface = new MyClass();
    

    我通常在共享服务中导出接口和类,然后在我的组件中导入它们并实例化它们。

    【讨论】:

    • MyClass 应该实现 IMyInterface。否则,IMyInterface 和 MyClass 之间没有联系。
    猜你喜欢
    • 2011-09-18
    • 1970-01-01
    • 2021-02-02
    • 2020-12-01
    • 2020-05-28
    • 1970-01-01
    • 2018-07-27
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多