接口无法添加到对象文字中

时间:2016-06-30 11:25:44

标签: typescript typescript1.8

我正在尝试在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
}

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

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

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

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

,则不起作用

3 个答案:

答案 0 :(得分:2)

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);

答案 1 :(得分:1)

这是如何定义类型的方法:

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以后的

答案 2 :(得分:1)

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

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

interface TestInterface {
    value: string 
}

let references: {
    interfaceReference: TestInterface
};

references.interfaceReference = {
    value: "some value"
};