typescript - 如何根据 TypeScript 中其他属性的值声明属性类型
问题描述
我有这个:
export type FieldType = 'number' | 'boolean' | 'string';
export interface IField {
key: string;
value: any;
type: FieldType;
}
是否可以用其他定义替换values
的类型,以便存储在属性中的值实际上是该字段包含的类型。即,如果一个对象在属性中具有值,则该属性持有的值必须是类型(等等)。any
value
type
'string'
type
value
string
number
boolean
这样可以这样工作:
const booleanTypeError = <IField>{
key: 'someKey',
value: 'true', // throw error
type: 'boolean'
};
const booleanTypeOK = <IField>{
key: 'someKey',
value: true, // no error
type: 'boolean'
};
const stringTypeOK = <IField>{
key: 'someKey',
value: 'true', // no error
type: 'string'
};
const stringTypeError = <IField>{
key: 'someKey',
value: true, // throw error
type: 'string'
};
我尝试使用keyof
and typeof
,但没有运气,因为我一直在出错。我正在使用 TypeScript 3.7.5(但我也可以使用 3.8)。
解决方案
您可以使用有区别的工会
type FieldType = 'number' | 'boolean' | 'string'
type IField = {
key: string;
} & {
value: number
type: 'number'
} | {
value: boolean
type: 'boolean'
} | {
value: string
type: 'string'
}
带接口
interface Base {
key: string
}
interface Bool extends Base {
value: boolean
type: 'boolean'
}
interface Num extends Base {
value: number
type: 'number'
}
interface Str extends Base {
value: string
type: 'string'
}
type IField = Bool | Num | Str
推荐阅读
- html - CSS Grid - 左侧菜单关闭时网格项未填满空间
- wordpress - 邮递员中的 REST GET 响应中缺少字段吗?
- mysql - 如何将此原始查询转换为续集 ORM
- redis - 如何获得 SMEMBERS 结果的子集?或者我应该对分数和成员使用具有相同值的 SortedSet 吗?
- phpstorm - 如果运行 phpcs,PhpStorm 会抛出错误
- javascript - .next('tag') 在纯 JavaScript 中?
- r - 仅保留 R 中第 2 个模式之前的部分
- azure-timeseries-insights - 塑造来自不同设备的事件(即不同的 json 属性)
- angular - Angular 7 CoreUI:将路由器用于分支 URL 图像链接
- visual-c++ - Visual C++ LNK2005 错误:已在 filename.obj 中定义变量名(使用 SFML)