首页 > 解决方案 > 如何根据 TypeScript 中其他属性的值声明属性类型

问题描述

我有这个:

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

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

是否可以用其他定义替换values的类型,以便存储在属性中的值实际上是该字段包含的类型。即,如果一个对象在属性中具有值,则该属性持有的值必须是类型(等等)。anyvaluetype'string'typevaluestringnumberboolean

这样可以这样工作:

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'
};

我尝试使用keyofand typeof,但没有运气,因为我一直在出错。我正在使用 TypeScript 3.7.5(但我也可以使用 3.8)。

标签: typescript

解决方案


您可以使用有区别的工会

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

推荐阅读