Typescript接口从同一接口的另一个属性设置属性类型
我有一个包含两个属性的接口,我希望第二个属性类型等于第一个属性,例如第一个属性类型是字符串Typescript接口从同一接口的另一个属性设置属性类型,typescript,types,interface,Typescript,Types,Interface,我有一个包含两个属性的接口,我希望第二个属性类型等于第一个属性,例如第一个属性类型是字符串 接口参数{ 类型:任意; allowedValues:[插入从'type'属性推断类型的方法] } 常数a:参数={ 键入:“字符串”, allowedValues:'test',//仅因为'type'属性是字符串 } 类型< /COD>属性可以是任何值,但允许值应该与类型< /代码>(或它的数组)相同类型:< P>在对应于您认为有效的参数< /> >的类型文件中没有具体的具体类型,其中,allowe
接口参数{
类型:任意;
allowedValues:[插入从'type'属性推断类型的方法]
}
常数a:参数={
键入:“字符串”,
allowedValues:'test',//仅因为'type'属性是字符串
}
<代码>类型< /COD>属性可以是任何值,但允许值应该与<代码>类型< /代码>(或它的数组)相同类型:
< P>在对应于您认为有效的<代码>参数< /> >的类型文件中没有具体的具体类型,其中,allowedValues
属性的类型必须与type
属性的类型相同。如果您希望能够在TypeScript中表示这一点,您可能需要将其更多地视为一个辅助函数,并使用一个辅助函数而不是类型注释来验证任何给定的候选值是否符合约束:
interface Argument<T> {
type: T;
allowedValues: T
}
const asArgument = <T,>(a: Argument<T>) => a;
如果尝试为允许值
提供与类型
不同类型的值,则会出现错误
请注意,通过使
参数
类型为泛型,您需要在需要跟踪此约束的任何位置拖动额外的泛型类型参数T
。我想象着将所有提到的参数
改为参数
,并将T
添加到任何必要的范围中。因此,我建议只在初始验证开发人员提交的参数时使用此约束,然后将其扩展到一个具体类型,如Argument,问题是任何东西都适合;无论type
的值是什么,它都有typeany
,因此允许的值可以有相同的类型。太好了!但是,如果我想要一个可以是任何类型的参数数组,那么这个类型保护不起作用<代码>类型脚本常量b:参数[]=[{type:'test',allowedvalue:4//没问题}]
const a = asArgument({
type: 'string',
allowedValues: 'test', // okay
});
asArgument({
type: 123,
allowedValues: 456
}); // okay
asArgument({
type: 'string',
allowedValues: 456 // error! Type 'number' is not assignable to type 'string'
})