在接口定义中使用导入

时间:2016-10-16 16:37:56

标签: javascript typescript interface ecmascript-6 es6-module-loader

我对打字稿界面有一个奇怪的问题。因为我使用猫鼬模型我需要定义一个,但由于某种原因它不能识别我明确导入的东西。这部分工作正常:

export interface ITrip extends mongoose.Document {
    //
}

export var TripSchema = new mongoose.Schema({
    //
});

export var Trip = mongoose.model<ITrip>('Trip', TripSchema);

现在,我正在定义另一个具有Trip数组的接口。我需要subdocuments

import {Trip, ITrip} from '../trips/trip.model';

export interface IFeed extends mongoose.Document {
  lastSnapshot: {
    trips: [Trip]
  }
}

TS编译器提供此错误:feed.ts(12,13): error TS2304: Cannot find name 'Trip'.(指trips: [Trip])。它没有说导入失败或任何东西。我甚至可以在同一个文件中使用trip来创建新对象var a = new Trip({});而没有问题。在界面内部它会破碎。

1 个答案:

答案 0 :(得分:0)

Trip不是一个类型,它是一个变量,所以你可以这样做:

let t = Trip;
let t2 = new Trip({});

但你不能这样做:

let t: Trip;

您应该将其更改为typeof Trip

export interface IFeed extends mongoose.Document {
    lastSnapshot: {
        trips: [typeof Trip]
    }
}

此外,如果您希望IFeed.lastSnapshot.trips成为数组,那么它应该是:

trips: typeof Trip[]

您声明的是一项tuple

修改

对于一个对象,赋值总是相同的(js和ts):

let o = {
    key: "value"
}

但是当在打字稿中声明类型时,你就不会处理值:

interface A {
    key: string;
}

let o: A = {
    key: "value"
}

在mongoose文档中,他们只使用javascript,因此他们的所有示例都不包含类型声明。