我想知道我是否可以在TypeScript中使用条件类型?

目前我有以下界面:

interface ValidationResult {
  isValid: boolean;
  errorText?: string;
}

但我想删除errorText,只有当isValidfalse时,作为required属性,我才拥有它.

我希望我能把它写成以下界面:

interface ValidationResult {
  isValid: true;
}

interface ValidationResult {
  isValid: false;
  errorText: string;
}

但正如你所知,这是不可能的.那么,你对这种情况有什么看法?

推荐答案

对这种逻辑建模的一种方法是使用联合类型,类似这样的

interface Valid {
  isValid: true
}

interface Invalid {
  isValid: false
  errorText: string
}

type ValidationResult = Valid | Invalid

const validate = (n: number): ValidationResult => {
  return n === 4 ? { isValid: true } : { isValid: false, errorText: "num is not 4" }
}

然后,编译器可以根据布尔标志缩小类型范围

const getErrorTextIfPresent = (r: ValidationResult): string | null => {
  return r.isValid ? null : r.errorText
}

Typescript相关问答推荐

为什么typescript不能推断类的方法返回类型为泛型''

当我点击外部按钮时,如何打开Html Select 选项菜单?

基于键的值的打字动态类型;种类;

在类型脚本中的泛型类上扩展的可选参数

是否有一个版本的联合类型递归地使属性只出现在一个可选选项中?

角效用函数的类型推断

<;T扩展布尔值>;

在Reaction-Native-ReAnimated中不存在Animated.Value

如何使所有可选字段在打印脚本中都是必填字段,但不能多或少?

使用Redux Saga操作通道对操作进行排序不起作用

如何将父属性类型判断传播到子属性

如何从MAT-FORM-FIELD-MAT-SELECT中移除焦点?

对象类型的TypeScrip隐式索引签名

如何在React组件中指定forwardRef是可选的?

错误:NG02200:找不到类型为';对象';的其他支持对象';[对象对象]';.例如数组

打印脚本中正则函数和函数表达式的不同类型缩小行为

窄SomeType与SomeType[]

映射类型不是数组类型

我可以使用对象属性的名称作为对象中的字符串值吗?

在Typescript 中,是否有一种方法来定义一个类型,其中该类型是字符串子集的所有可能组合?