Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript接口从同一接口的另一个属性设置属性类型_Typescript_Types_Interface - Fatal编程技术网

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
的值是什么,它都有type
any
,因此
允许的值可以有相同的类型。太好了!但是,如果我想要一个可以是任何类型的参数数组,那么这个类型保护不起作用<代码>类型脚本常量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'
})