typescript - 在表达“这个对象字面量的值都是 T 类型”时保持类型安全。
问题描述
这是一个示例,其中T
is StringConstant
。
type StringConstant =
'fooValue' |
'barValue' |
'bazValue';
尝试01
我们尝试将每个属性转换为对象字面量as StringConstant
。缺点是这种方法不会对属性值进行类型检查。
const StringConstant01 = {
foo: 'fooValue' as StringConstant,
bar: 'barValue' as StringConstant,
baz: 'bazValue!!!' as StringConstant, // no error, bad
}
虽然它确实适用于对类型常量的赋值,T
并在我们使用错误的属性键时捕获错误。
const x: StringConstant = StringConstant01.bar;
const y: StringConstant = StringConstant01.qux; // error, good
尝试02
我们尝试过使用索引类型。
type StringConstantMap = {
[key: string]: StringConstant;
}
const StringConstant02: StringConstantMap = {
foo: 'fooValue',
bar: 'barValue',
baz: 'bazValue!!!' // error, good
}
缺点是我们丢失了属性键的类型信息。
const x: StringConstant = StringConstant02.bar;
const y: StringConstant = StringConstant02.qux; // no error, bad
解决方案
使用接口:
interface IStringConstants {
foo: StringConstant;
bar: StringConstant;
baz: StringConstant;
}
const StringConstant01: IStringConstants = {
foo: 'fooValue',
bar: 'barValue'
baz: 'bazValue!!!' // error
}
你不能阻止的是这'bazValue!!!' as StringConstant
不会导致编译器错误。
推荐阅读
- angularjs - 如何从外部代码控制 angularjs 表单提交操作
- java - jdeps 在 sprinboot 项目上失败
- firebase - Admin SDK 的 Firebase 身份验证限制?
- r - 使用 r 中包含“$”的字符串获取变量名
- python - PyCharm,从项目文件夹中解析库
- sql - 我是不耐烦还是效率低下?
- rust - 结果
模式匹配 - javascript - 如何从openstreetmap获取坐标
- memory-leaks - 英特尔 MKL SPBLAS 的内存泄漏
- android - 如何比较我选择的日历结束时间是否早于 12 小时日历时间的所选日历开始时间?