我对打字稿界面有一个奇怪的问题。因为我使用猫鼬模型我需要定义一个,但由于某种原因它不能识别我明确导入的东西。这部分工作正常:
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({});
而没有问题。在界面内部它会破碎。
答案 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,因此他们的所有示例都不包含类型声明。