typescript - 键入我们知道是字符串的对象的属性
问题描述
我在一个类中有一个方法,它的调用签名是:
async where(
prop: K & string,
value: PropType<T, K> | [IComparisonOperator, PropType<T, K>],
options: IDexieListOptions<T> = {}
) { ...}
该类的定义将 T 和 K 定义为:
class MyClass<T extends Model, K extends keyof T> { ... }
PropType
类型就是这样:
type PropType<TObj, TProp extends keyof TObj> = TObj[TProp]
在同一类的另一种方法中,我尝试where
像这样使用:
async since(datetime: epoch) {
return this.where("lastUpdated", [">", datetime]);
}
该lastUpdated
属性是扩展的有效属性,Model
当然<T>
它也是一个“字符串”,因此它似乎符合签名where()
但我得到了这个错误:
'"lastUpdated"' 可分配给'K' 类型的约束,但'K' 可以用约束'string | 的不同子类型实例化。号码 | 象征'。
有谁知道如何解决这个问题?
这个Model
类——我应该从一开始就包括在内——被定义为:
export class Model {
public id?: string;
public lastUpdated?: number;
public createdAt?: number;
}
我确实想知道可选的事实lastUpdated
是否是一个促成因素,但即使将其设为必需似乎也没有什么区别。
解决方案
问题是您的类将第二个泛型参数定义为的K
任何子类型,但您在函数keyof T
中使用具体的子类型时还不知道。这是不允许的,这里有详细说明:https ://stackoverflow.com/a/59363875/1628117"lastUpdated"
since()
T
上述注释中@jcalz 的解决方案是通过让函数本身决定调用时where
适合的子类型来解决此问题的方法。keyof T
class MyClass<T extends Model> {
async where<K extends keyof T>(
prop: K, ...
) { }
...
}
推荐阅读
- android - 使用非主构造函数启动服务 - 传递的变量为 null onStartCommand
- android - 可绘制为可样式以及如何选择主题
- mysql - Mysql 程序遇到语法错误
- python - 跨天匹配两个变量并检查第三个
- r - R partykit:我如何使用偏移量?
- ruby-on-rails - 将 Webpacker 添加到 Rails 应用程序后的疯狂加载时间
- php - 我正在尝试将数据库值存储在 PHP 变量中,但 id 显示未定义的索引错误
- java - 没有编译器错误,但它没有更改字符串
- c++ - 如何复制c++ printf函数
- excel - Excel 转换不同格式的日期