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';
}