如何基于TypeScript中某些其他属性的值声明属性类型

时间:2020-04-30 13:26:53

标签: typescript

我有这个:

export type FieldType = 'number' | 'boolean' | 'string';

export interface IField {
  key: string;
  value: any;
  type: FieldType;
}

是否可以用其他定义替换values的{​​{1}}类型,以便存储在any属性中的值实际上是value字段包含的类型。即如果对象在type属性中具有'string'值,则type属性持有的值必须为value类型(对于string和{{1} })。

这样可以这样工作:

number

我尝试使用booleanconst 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' }; ,但是由于我一直都在出错,所以运气不佳。我正在使用TypeScript 3.7.5(但我也可以使用3.8)。

1 个答案:

答案 0 :(得分:2)

您可以使用已区分的并集

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
相关问题