Since protected
仅在设计时生成错误,并且不会阻止运行时的访问,您可能会通过另一种方式获得类似的行为hiding导出类型的相关属性,如下所示:
首先,将父类的属性公开:
class ICompetence {
_id: number | undefined;
name: string | undefined;
}
然后正常扩展该类,但不导出它,并将其重命名为_Competence
(“真实的”Competence
稍后会来)
class _Competence extends ICompetence {
otherProperty: string = "hmm"; // demonstrate you can add other things
set<K extends keyof ICompetence>(key: K, value: ICompetence[K]): void {
this[key] = value;
}
get<K extends keyof ICompetence>(key: K): ICompetence[K] {
return this[key];
}
constructor() {
super();
}
}
现在我们准备Competence
。首先我们定义类型函数Omit
,它从类型中删除指定的键:
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>
然后我们导出一个名为Competence
和一个名为Competence
,它们源自_Competence
但不要暴露来自的属性ICompetence
。当然,它们仍然存在,但类型系统不会公开它们:
export interface Competence extends Omit<_Competence, keyof ICompetence> { }
export const Competence = _Competence as new () => Competence;
现在,在您的消费者代码中,您应该能够执行以下操作:
const competence = new Competence();
competence.name // error at compile time
competence.otherProperty // okay
const name = competence.get("name") // string or undefined
它有效。希望有帮助。祝你好运!