基于TypeScript中的另一个属性值动态解析属性类型
我有以下TypeScript界面:基于TypeScript中的另一个属性值动态解析属性类型,typescript,Typescript,我有以下TypeScript界面: interface SelectProps { options: Option[]; value: string[]; onChange: (value: string[]) => void; } 我想添加名为isMultiple的布尔值,它将更改其他属性的类型 当isMultiple=true时 强制执行值:字符串[] 强制执行onChange:(值:string[])=>void 当isMultiple=false时
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 onChangevalue
参数作为选项之一键入?那么onChange回调也可以根据正确的值进行验证?我猜在这种情况下,选项
不可能是动态的?第一种方法的一个问题是,值
可能是字符串
,而一旦更改
可能是(值:字符串[])=>无效
@AntonyO Neill是的,你是对的。另一个(被接受的)答案中的解决方案更好。