You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据TypeScript接口内其他属性值定义必填属性?

实现条件必填的TypeScript类型定义需求

需求描述

当PadOperator类型的operator属性值为'CUSTOM_CHAR_LEFT'或'CUSTOM_CHAR_RIGHT'时,customSymbol属性需设为必填项;其余operator值下,customSymbol为可选(或无需提供)。

现有代码

export type PadOperator =
  | 'CUSTOM_CHAR_LEFT'
  | 'CUSTOM_CHAR_RIGHT'
  | 'NONE'
  | 'SPACE_CHAR_LEFT'
  | 'SPACE_CHAR_RIGHT'
  | 'ZERO_CHAR_LEFT'
  | 'ZERO_CHAR_RIGHT'
  ;
  
interface PadOption {
    operator: PadOperator;
    customSymbol: string
}

尝试的错误代码

interface PadOption {
    operator: PadOperator;
    customSymbol: PadOperator extends ('CUSTOM_CHAR_LEFT' | 'CUSTOM_CHAR_RIGHT') ? string | undefined;
}

正确实现方案

要实现这种基于属性值的条件必填约束,需要使用TypeScript的可辨识联合类型(Discriminated Union),将PadOption拆分为两个互斥的类型分支:

export type PadOperator =
  | 'CUSTOM_CHAR_LEFT'
  | 'CUSTOM_CHAR_RIGHT'
  | 'NONE'
  | 'SPACE_CHAR_LEFT'
  | 'SPACE_CHAR_RIGHT'
  | 'ZERO_CHAR_LEFT'
  | 'ZERO_CHAR_RIGHT'
  ;

type PadOption = 
  // 自定义字符场景:customSymbol 必填
  {
    operator: 'CUSTOM_CHAR_LEFT' | 'CUSTOM_CHAR_RIGHT';
    customSymbol: string;
  }
  // 其他场景:customSymbol 可选(若不需要该属性可直接删除此字段)
  | {
    operator: Exclude<PadOperator, 'CUSTOM_CHAR_LEFT' | 'CUSTOM_CHAR_RIGHT'>;
    customSymbol?: string;
  };

方案说明

  • 第一个分支专门匹配需要自定义字符的operator值,强制customSymbol为必填字符串;
  • 第二个分支用Exclude工具类型排除需要自定义字符的operator值,此时customSymbol设为可选;
  • 这种写法能让TypeScript根据operator的具体值,自动推断customSymbol的必填性,在编译阶段完成约束检查。

内容的提问来源于stack exchange,提问作者BR75

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 11:57:17