typescript - 在 TypeScript 中强制对象中的对象具有相同的类型
问题描述
我需要创建一个常量列表,例如,
const Days = {
YESTERDAY: -1,
TODAY: 0,
TOMORROW: 1,
}
我想要一种方法来约束 中所有属性的类型Days
,也就是说,如果我添加一个属性BAD_DAY: true
,我希望编译器会抱怨。
我开始创建类似的东西
type ObjectOf<T> = {[k: string]: T};
const Days: ObjectOf<number> = {
A: true;
}
这确实给了我一个错误,但是,当我在Days.
. 我理解这是因为我将其设为键控对象类型。
我可以像第一个示例一样获得代码完成,也可以通过第二个示例获得编译器帮助。我可以把我的蛋糕也吃掉吗?我想我想要一些行为类似于 Java Enums 的东西,因为它是同类型对象的已知列表。
enum Days{
Today("SUN"), MONDAY("MON"), TUESDAY("TUES"), WEDNESDAY("WED"),
THURSDAY("THURS"), FRIDAY("FRI"), SATURDAY("SAT");
private String abbreviation;
public String getAbbreviation() {
return this.abbreviation;
}
Days(String abbreviation) {
this.abbreviation = abbreviation;
}
}
解决方案
有你的蛋糕,也吃它。关于const
你需要一个通用的辅助函数。辅助函数将强制执行约束,但会推断传入对象字面量的真实类型:
type ObjectOf<T> = {[k: string]: T};
function createObjectOfNumber<T extends ObjectOf<number>>(v:T){
return v;
}
const Days = createObjectOfNumber({
A: 1
// B: true // would be an error
});
Days.A // ok
或更通用的版本:
function createObjectOf<TValue>(){
return function<T extends ObjectOf<TValue>>(v:T){
return v;
}
}
const Days = createObjectOf<number>()({
A: 1
// B: true // would be an error
});
Days.A // ok
如果您想要 Java 枚举之类的东西,Typescript 中没有对此的语言支持,但您可以模拟它们,请参阅此答案
推荐阅读
- javascript - Mongoose 用于同一连接的多个模型
- postgresql - 使用 Terraform 在 AWS RDS PostgreSQL 上启用 PostGIS
- spring-boot - 通过使用 Docker-Compose 和 Spring Boot 运行的 IP 地址访问远程主机中的 Kafka
- ionic-framework - 未捕获(承诺):错误:无法匹配任何路由。URL 段:'tabs/tab1'
- python - 如何在 Python 中创建自定义类型验证函数?
- esper - esper 查询执行了一半——实际上只有一部分在运行
- json - 如何在没有占位符的情况下更改空手道 DSL 中文本响应的所有外观?
- node.js - 生产实例与本地实例的 mongodb 查询性能如何慢得多
- vue.js - 将 v-model 与 Vuex 商店一起使用时出现 Vuetify 导航抽屉错误
- node.js - 单身人士没有在节点中保持奇偶性