我有以下内容:
type UserModel = {
id: number;
email: string;
};
export class ActiveRecord<T> {
constructor(fields: T) {
Object.assign(this, fields);
}
}
class User extends ActiveRecord<UserModel> {}
const user = new User({ id: 1, email: "foo" });
这在JS中完全有效,但是我不能在user
上的TS中自动完成,因为它只是User
类型,而不是User & UserModel
。
有什么方法可以完全输入user
吗?
运动场
1条答案
按热度按时间eqfvzcg81#
TypeScript要求
interface
(包括class
声明的示例类型)必须具有 statically known keys。这意味着不可能编写类示例的键名本身为泛型的genericclass
声明。您可以定义此类构造函数的预期类型,但是没有class
语句将产生该类型的构造函数。从表面上看,这意味着你所要求的是不可能的,但根据你的用例,你可以解决它。一种方法是Assert
class
构造函数是所需的类型:现在有了一个
ActiveRecord
类构造函数,编译器完全按照预期的方式将其视为泛型,甚至可以将其用作超类,只要在执行此操作时使用具有非泛型键的类型 * 示例化 *T
:关于示例化的警告意味着您不能这样做:
T
的键在编译时是未知的,所以编译器会抱怨。你可以让你的子类泛型化,只要ActiveRecord
的类型参数没有任何未知的键:只要您不需要最终从
ActiveRecord
派生的 * 泛型 * 类层次结构,那么这可能是一种可接受的方法。