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)
有几种选择。
我们可以在接口上使用通用类型参数来指定 的类型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)
另一种选择是使用该字段Pick并Exclude从接口中删除该字段,以便我们可以根据需要覆盖它(您会发现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)
我会看到两个选项:
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)
| 归档时间: |
|
| 查看次数: |
2206 次 |
| 最近记录: |