在接口定义中使用导入

Use imports inside interface definition

我在打字稿接口方面遇到了一个奇怪的问题。因为我使用的是猫鼬模型,所以我需要定义一个模型,但出于某种原因,它无法识别我明确导入的内容。这部分工作正常:

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({});。在界面里面它坏了。

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,因此他们的所有示例都不包含类型声明。