基于TypeScript中的另一个属性值动态解析属性类型

基于TypeScript中的另一个属性值动态解析属性类型,typescript,Typescript,我有以下TypeScript界面: interface SelectProps { options: Option[]; value: string[]; onChange: (value: string[]) => void; } 我想添加名为isMultiple的布尔值,它将更改其他属性的类型 当isMultiple=true时 强制执行值:字符串[] 强制执行onChange:(值:string[])=>void 当isMultiple=false时

我有以下TypeScript界面:

interface SelectProps {
    options: Option[];
    value: string[];
    onChange: (value: string[]) => void;
}
我想添加名为
isMultiple
的布尔值,它将更改其他属性的类型

isMultiple=true时

  • 强制执行
    值:字符串[]
  • 强制执行
    onChange:(值:string[])=>void
isMultiple=false时

  • 强制执行
    value:string
  • 强制执行
    onChange:(值:string)=>void

是否可以根据一个属性的值动态设置其他属性的类型?

不,您不能这样做,但这里有两种选择

(1) 对
onChange
使用联合类型:

interface SelectProps {
    options: Option[];
    isMultiple: boolean;
    value: string | string[];
    onChange: (value: string | string[]) => void;
}
(2) 在这两种情况下使用两种不同的接口:

interface SelectProps {
    options: Option[];
    isMultiple: boolean;
}

interface SingleSelectProps extends SelectProps {
    value: string;
    onChange: (value: string) => void;
}

interface MultipleSelectProps extends SelectProps {
    value: string[];
    onChange: (value: string[]) => void;
}

function isSingle(props: SelectProps): props is SingleSelectProps {
    return !props.isMultiple;
}

function isMultiple(props: SelectProps): props is MultipleSelectProps {
    return props.isMultiple;
}

()

有点晚了,但我希望它能像帮助我一样帮助别人

有区别的并集(也称为标记并集或代数数据类型)可用于解决此问题

interface MultipleSelectProps{
多重:正确;
选项:字符串[];
值:字符串[];
onChange:(值:string[])=>void;
}
界面单选择道具{
多重:错误;
选项:字符串[];
值:字符串;
onChange:(值:string)=>void;
}
键入SelectProps=多个SelectProps |单个SelectProps;
用法示例:

function Select(props: SelectProps) {
    if (props.isMultiple) {
        const { value, onChange } = props;
        onChange(value);
    } else if (props.isMultiple === false) {
        const { value, onChange } = props;
        onChange(value);
    }
}
注意:当
isMultiple
未定义的
null
时,无法推断
SelectProps
的特定类型。在这些情况下,需要进行严格的比较
isMultiple==false


来源:

这似乎适用于调用代码,但接受
SelectProps
的函数似乎无法区分
onChange
调用。请参阅以获取示例。这是因为is multiple可以是未定义的或null。在这些情况下,无法推断
SelectProps
的具体类型。完整答案太棒了!如果您使用用法
功能选择(props:SelectProps)
更新您的答案,那么我将标记为正确答案!完成。很高兴提供帮助。是否有任何方法可以将check onChange
value
参数作为
选项之一键入?那么onChange回调也可以根据正确的值进行验证?我猜在这种情况下,
选项
不可能是动态的?第一种方法的一个问题是,
可能是
字符串
,而
一旦更改
可能是
(值:字符串[])=>无效
@AntonyO Neill是的,你是对的。另一个(被接受的)答案中的解决方案更好。