2016-06-20 3 views
3

문서 대신 내 모델의 인터페이스 만 내보내고 아무도 내 모델을 수정할 수 없도록합니다. 내 모델이 자체 클래스 메서드에 없으면 수정할 수 있습니다.몽구스 + Typescript -> 모델 인터페이스 내보내기

IUSER :

interface IUser { 
    _id: string; 
    name: string; 
    email: string; 
    created_at: number; 
    updated_at: number; 
    last_login: number; 
} 

그리고 스키마 :

let userSchema: Mongoose.Schema = new Mongoose.Schema({ 
    'name': String, 
    'email': String, 
    'created_at': {'type': Date, 'default': Date.now}, 
    'updated_at': {'type': Date, 'default': Date.now}, 
    'last_login': {'type': Number, 'default': 0}, 
}); 

interface UserDocument extends IUser, Mongoose.Document {} 

그리고 모델

// Model 
let Users: Mongoose.Model<UserDocument> = Mongoose.model<UserDocument>('User', userSchema); 

그래서 난 그냥 수출 나는 인터페이스와 같은 스키마를 정의 IUser 및 클래스 사용자에게는 기본적으로 내 모델을 업데이트하는 모든 메서드가 있습니다.

문제는 typescript가 _id를 인터페이스에 추가하면 불만을 나타내지 만 실제로 필요하다면 그렇지 않으면 UserDocument를 전달해야하므로 그 작업을 원하지 않습니다. 오류 타이프립트는 다음과 같습니다 :

오류 TS2320 : 인터페이스 'UserDocument'는 'IUser'및 'Document'유형을 동시에 확장 할 수 없습니다. 'IUser'및 'Document'형식의 '_id'속성이 동일하지 않습니다.

아이디어가 어떻게 내 인터페이스에 _id 속성을 추가 할 수 있습니까?

감사합니다.

+0

몽구스의'_id'는 기본적으로'ObjectId' ('mongoose.Schema.Types.ObjectId') 타입입니다. – robertklep

+0

안녕하세요 @robertklep, 나는 이미 문자열 대신에 그것을 시도했지만, 나는 _id를 넣을 때만 똑같은 오류를줍니다 : 어떤 불평도 멈추지 만 이상적이지는 않습니다. – asheinfeld

+0

너무 나빴어 : (TS에 대한 경험이 없으므로 걱정할 필요가 없다.) – robertklep

답변

6

시도 :

interface UserDocument extends IUser, Mongoose.Document { 
    _id: string; 
} 

그것은 Mongoose.Document._id 대 IUser._id (문자열) (모든) 사이의 충돌을 해결합니다.

업데이트 :

으로 댓글에서 지적은, 현재 그렇게 또 다른 해결 방법이 사용되어야하는 incompatible override for member from "Document" 제공합니다. Intersection types은 사용할 수있는 솔루션입니다. 즉, 다음을 수행 할 수 있습니다 특징 :

type UserDocument = IUser & Mongoose.Document; 

다른 방법으로, 더 이상 UserDocument을하지 않으려면 :이 솔루션의 부작용이 있음을 주목할 필요가있다

// Model 
let Users = Mongoose.model<IUser & Mongoose.Document>('User', userSchema); 

. 상충되는 속성은 교차 된 유형을 가지므로 IUser._id (string) & Mongoose.Document._id (any) 결과는 UserDocument._id (any)입니다.

+0

감사합니다. – asheinfeld

+1

정말요? 이것은 "문서"의 멤버에 대해 '호환되지 않는 오버 라이드'를줍니다. –

관련 문제