我上了这个课:
export class User{
fName: string;
lName: string;
get FullName() { return this.fName + ' ' + this.lName }
}
然后我创建了User
的集合:
cost userRepo = this.connection.db(db).collection<User>(db)
问题在于,当我执行userRepo.find({})
时,我可以发送FullName
作为参数。
所以,我的问题是,有一种简单的方法可以从现有的类中创建新类型,但不包括getter / setter? (没有创建接口或基类...)
答案 0 :(得分:1)
您不能真正在类型级别将属性与getter / setter区别开。因此,正如其他人所说,对您的问题的简短回答是“否”。
一种可能的 方法是,将带有吸气剂但没有setter的属性最终视为readonly
。事实证明,您可以 使用一些疯狂的类型操作魔术来创建一个可以提取readonly
属性的类型函数:
// detect if two types X and Y are exactly identical
type IfEquals<X, Y, A=X, B=never> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2) ? A : B;
// writable keys are those which are exactly equal when you strip readonly off
// in a mapped type
type WritableKeys<T> = {
[P in keyof T]-?: IfEquals<{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }, P>
}[keyof T];
以及您要查找的类型:
type UserWithoutGetters = Pick<User, WritableKeys<User>>;
// type UserWithoutGetters = {
// fName: string;
// lName: string;
// }
有帮助吗?祝你好运!
答案 1 :(得分:0)
不是。该类只是您将要创建的对象的蓝图。上面的类将被编译为javascript中的函数构造函数,并将始终包含最初赋予它的所有属性。