打字稿:覆盖扩展接口中的字段

Flo*_*dis 4 interface typescript

我有一个扩展 2 个其他接口的接口。

除了一件事外,新接口是相同的:字段 '_id' 应该是字符串而不是 ObjectId(为了更容易的服务器端操作)。

是否可以覆盖新界面中的字段类型?当我这样做时,tslint 告诉新接口没有正确扩展以前的接口。

我也想避免联合类型,例如: _id : ObjectId | string

export interface AchievementDb {
    _id: ObjectID; 
    title: string;
    description: string;
    // more stuff
}

export interface AchievementUserProgress {
    _id: ObjectID;
    progress: number;
    status: UserAchievementStatus;
    // more stuff
}

export interface AchievementFull extends AchievementDb, AchievementUserProgress {
    _id: string;
}
Run Code Online (Sandbox Code Playgroud)

Tit*_*mir 5

有几种选择。

我们可以在接口上使用通用类型参数来指定 的类型id。如有必要,我们可以指定一个默认类型参数,以便能够继续使用没有类型参数的接口:

export interface AchievementDb<T = ObjectID> {
  _id: T; 
  title: string;
  description: string;
  // more stuff
}
export interface AchievementUserProgress<T = ObjectID> {
  _id: T;
  progress: number;
  status: UserAchievementStatus;
  // more stuff
}

export interface AchievementFull extends AchievementDb<string>, AchievementUserProgress<string> {
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用该字段PickExclude从接口中删除该字段,以便我们可以根据需要覆盖它(您会发现Omit其他人定义的类似类型)

type ExcludeId<T> = Pick<T, Exclude<keyof T, '_id'>>
export interface AchievementFull extends ExcludeId<AchievementDb>, ExcludeId<AchievementUserProgress> {
  _id: string;
}
Run Code Online (Sandbox Code Playgroud)


Rom*_*ain 5

我会看到两个选项:

基本接口

interface WithID {
    _id: ObjectID;
}

interface AchievementDbBase {
    title: string;
    description: string;
    // more stuff
}

interface AchievementDb extends AchievementDbBase, WithID {

}

interface AchievementUserProgressBase {
    progress: number;
    // more stuff
}

interface AchievementUserProgress extends AchievementUserProgressBase, WithID {

}

interface AchievementFull extends AchievementDbBase, AchievementUserProgressBase {
    _id: string;
}
Run Code Online (Sandbox Code Playgroud)

使用省略

看一看排除类型(https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html)允许这种映射类型: http://ideasintosoftware.com/typescript -高级技巧/

在你的情况下:

interface AchievementFull extends Omit<AchievementDb, '_id'>, Omit<AchievementUserProgress, '_id'>  {
    _id: string;
}
Run Code Online (Sandbox Code Playgroud)