typescript - 类构造函数类型
问题描述
我想在我的类中要求一种或另一种类型的构造函数:
const instance: MyClass = new MyClass({ digit: 5 });
... 或者 ...
const instance: MyClass = new MyClass({ letter: 'x' });
它不能同时是两个,也不能是其他一些对象。
目前我有这个:
interface MyClassConstructor {
digit?;
letter?;
}
interface MyClassDigit extends MyClassConstructor {
digit: number;
}
interface MyClassLetter extends MyClassConstructor {
letter: string;
}
class MyClass {
constructor(obj: MyClassDigit | MyClassLetter) {
if (obj.digit) {
// ...
} else if (obj.letter) {
// ...
}
}
}
但我不认为这是这样做的正确方法......
解决方案
我不会对您的解决方案做出太大改变。我不会拥有具有这两个属性的基本接口。我只会使用联合和in
类型保护:
interface MyClassDigit {
digit: number;
}
interface MyClassLetter {
letter: string;
}
class MyClass {
constructor(obj: MyClassDigit | MyClassLetter) {
if ('digit' in obj) {
// obj is MyClassDigit
} else {
// obj is MyClassLetter
}
}
}
如果您有更多参数并且只需要一个成员,则可以使用条件类型自动生成类型:
interface MyParams {
digit?: number;
letter?: string;
}
type RequireOne<T> = (keyof T) extends infer K ?
K extends keyof T ?
Required<Pick<T, K>> : never : never
class MyClass {
constructor(obj: RequireOne<MyParams>) {
if ('digit' in obj) {
// obj has digit
} else {
// obj has letter
}
}
}
推荐阅读
- php - 带有 FPM 配置的 PHP Composer
- ios - 以编程方式快速定位和约束
- r - 如何检查 id 是否在特定日期进入数据并保留到退出日期
- node.js - 如何自定义firebase DocumentData 接口?
- python-3.x - 如何允许用户在节点之间添加边?
- c++ - 创建玩家向量并向每个玩家添加信息
- java - 以编程方式创建布局时在 Camera2 API 中拉伸的预览
- arrays - Oracle 11 中的数组
- c# - 如何将 SQL Server 数据库与 Coded UI Test 结合使用?
- android - 有没有办法吸引下载应用但从不打开的用户?