【问题标题】:Interface cannot be added to object literal接口不能添加到对象字面量
【发布时间】:2016-11-02 11:15:12
【问题描述】:

我正在尝试向 TypeScript 1.8.10 中的对象文字添加接口,但它似乎不起作用:

interface TestInterface {
    value: string 
}

let references = {
    interfaceReference: TestInterface
}

如果我编译代码,编译器会抛出错误Cannot find name "TestInterface",尽管它之前已正确指定。作为 Angular 2 项目的一部分,我需要将接口添加到对象。

如果我用抽象类替换接口,一切似乎都可以工作:

abstract class TestInterface {
    value: string 
}

let references = {
    interfaceReference: TestInterface
}

但是,能够在这些定义中使用接口会导致代码更简洁。所以,我希望有办法做到这一点。

编辑:澄清我想要做什么以及为什么我使用接口: Angular 2 包含依赖注入机制。您可以在引导代码的对象文字中指定从抽象服务定义到具体服务实现的映射:

bootstrap(AppComponent, [ { provide: TestInterface, useClass: TestClass} ]

但是,如果 TypeScript 无法将对象属性的值设置为接口,这将不起作用

【问题讨论】:

    标签: typescript typescript1.8


    【解决方案1】:

    tsc 抱怨的原因是,interfaces 不会被转译成 JavaScript,但 classes 会。

    因此,您在代码中所做的是将 JavaScript 对象分配给变量 references: 之后的值必须是一个带有值的表达式(例如一个变量),如果 TestInterface 是一个类,它就可以工作,因为它被转换为一个像这样的变量:

    var TestInterface = (function () {
        function TestInterface() {
        }
        return TestInterface;
    }());
    

    要让你的作业真正发挥作用,你必须将它重写为这样的:

    let references: { interfaceReference: TestInterface } = { interfaceReference: null };
    

    另一方面,如果您热衷于使用接口,为什么要开始使用 JavaScript 对象呢?更好的方法是像这样再次封装这些引用:

    interface TestInterface {
        value: string 
    }
    
    class InterfaceReferences {
        constructor(public interfaceReference: TestInterface) {}
    }
    
    let references: InterfaceReferences = new InterfaceReferences(testInterface);
    

    【讨论】:

    • 我将您的答案标记为解决方案,因为它说明了 TypeScript 在我的具体案例中的“限制”。经过进一步研究,Angular 2 意识到无法将接口设置为对象值,并因此引入了 OpaqueToken
    【解决方案2】:

    这是定义类型的方式:

    interface TestInterface {
        value: string 
    }
    
    // firstly define type of the variable - next assign it value
    let references: { 
        interfaceReference: TestInterface
    } = {
        interfaceReference: null,
    };
    

    所以,首先 - 在 ":" 之后我们定义类型
    其次 - 在 "=" 之后,我们定义了它的值

    最好是创建一个界面:

    interface SomeType { 
        interfaceReference: TestInterface
    }
    
    let references: SomeType = {
        interfaceReference: null,
    };
    

    因为我们以后可以重用 SomeType

    【讨论】:

      【解决方案3】:

      您正在尝试将 interfaceReference 的值设置为 TestInterface,这在运行时中不存在(因为接口未编译为 JavaScript)。

      您应该使用冒号 (:) 来设置 references 的类型,然后您可以设置您的值。

      interface TestInterface {
          value: string 
      }
      
      let references: {
          interfaceReference: TestInterface
      };
      
      references.interfaceReference = {
          value: "some value"
      };
      

      【讨论】:

        猜你喜欢
        • 2021-08-24
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 2011-03-09
        • 2014-08-30
        • 2017-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多