Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.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
Javascript TypeScript:类型A的索引键和类型B的保留键_Javascript_Typescript - Fatal编程技术网

Javascript TypeScript:类型A的索引键和类型B的保留键

Javascript TypeScript:类型A的索引键和类型B的保留键,javascript,typescript,Javascript,Typescript,我需要定义一种类型,允许将预定义键分配给类型a,并将所有其他键分配给类型B 我尝试了以下操作,但出现以下错误: 键入Foo=“Foo”; 键入Bar=“Bar”; 接口引信{ [键:字符串]:Foo } 接口Qux{ 显示?:条 } 类型Bash=Qux&Fuz; //错误:TS2322--类型“bar”不可分配给“foo” 常数a:Bash={ 显示:“条” }; //错误:TS2322--类型“foo”不可分配给“bar” 常数b:Bash={ 显示:“foo” }; 我想这与写作基本相同

我需要定义一种类型,允许将预定义键分配给类型
a
,并将所有其他键分配给类型
B

我尝试了以下操作,但出现以下错误:

键入Foo=“Foo”;
键入Bar=“Bar”;
接口引信{
[键:字符串]:Foo
}
接口Qux{
显示?:条
}
类型Bash=Qux&Fuz;
//错误:TS2322--类型“bar”不可分配给“foo”
常数a:Bash={
显示:“条”
};
//错误:TS2322--类型“foo”不可分配给“bar”
常数b:Bash={
显示:“foo”
};
我想这与写作基本相同:

接口引信{
//错误:TS2411--类型为“bar”的属性“display”不可分配给字符串索引类型“foo”
显示?:条
[键:字符串]:Foo
}
有没有实现上述目标的方法?

考虑一下:

正如您所建议的定义所示,
value
显然包含字符串
bar
,但就typescript所能理解的而言,它实际上是
foo

据我所知,没有一种方法可以给出“非显式定义的键”字段,以便
x[string]
将是所有适用字符串的并集

我知道获得所需行为类型的唯一方法是指定值为
Foo
,或者在字符串键为
bar
的情况下,它是
bar
,因此字符串索引必须是并集:

interface CorrectFuz {
    bar: 'bar';
    [k: string]: 'bar' | 'foo';
}
有可能有更好的解决方案,我需要更多关于您的实际用例的信息,以了解如何提供帮助

我需要定义一个类型,允许将预定义的键分配给类型a,并将所有其他键分配给类型B


我认为你对打字稿的期望是错误的。类型不会被“分配”到任何东西。创建类型联合时,通过松开类型定义来扩展该变量的可能值;创建类型交叉时,通过扩展类型定义来限制该变量的可能值。

表示该变量的唯一方法(从TS3.5开始)是通过通用约束,不是作为具体类型或接口
typefuz={display?:Bar}&Record
就可以了,但是现在所有处理该类型的函数都必须是泛型函数,并且该类型的所有值都需要从泛型函数或手动指定的泛型类型返回。总结一下我的回答:如果保留键是类型
B
,并且任何键必须是类型
A
,那么保留键也必须符合类型
A
,因此,如果
B
A
不兼容,该接口就没有意义。因此,typescript告诉您这是无效的。看起来不错,但是您可以使用这种方法将值
'foo'
设置到字段
栏中,因此类型签名具有误导性。这实际上代表的是所有字段都可以使用“bar”|“foo”
,而不仅仅是字符串索引字段:
const a:CorrectFuz={};常量条:字符串='bar';a[bar]=“foo”否这是不可能的。条形图只能是
条形图
。我刚刚检查了它。我意识到,只要你给一个对象添加一个“字符串索引”,因为它允许你在任何键上设置值,所有其他定义的字段也需要支持该字符串索引字段的类型。此外,由于可以通过字符串索引读取任何字段,因此字符串索引字段的类型也需要支持所有其他字段的类型。因此,所有字段都需要支持完全相同的类型(如果引入字符串索引器)@阿文卡维什你确定吗?尝试按原样复制粘贴此代码:
interface CorrectFuz{bar?:'bar';[k:string]:'bar'|'foo';}常量a:CorrectFuz={};常量条:字符串='bar';a[bar]=“foo”;console.log(a[bar])是的,没有类型错误。这是因为您使用的是字符串变量。条是字符串的类型。bar不是“bar”的类型,所以让我们通过typescript来完成它。如果你想这样做,你可能想在打字稿中索取它,但我想他们会考虑的。将其更改为['bar']='foo',错误将返回。
interface CorrectFuz {
    bar: 'bar';
    [k: string]: 'bar' | 'foo';
}