我有一个具有某些类型的属性的接口
interface dummyInterface {
propA: string,
propB: boolean,
propC: number,
}
道具A到C是必需的,但此类型的对象还可以包含任意数量的任何名称的附加属性。但是,我想强制所有其他属性为string
类型。我知道无法通过添加类似
{
.
.
.
[additionalProp: string]: string
}
因为这会分别与PropB
和PropC
boolean
和number
相矛盾。
有什么方法可以实现这个目标吗?
答案 0 :(得分:1)
您可以使用类型交集来实现:
interface MandatoryProps {
numberProp: number;
boolProp: boolean;
}
type TypeWithMandatoryAndOptionalProps =
// For mandatory props:
MandatoryProps &
// For optionals:
Record<string, string>;
declare const foo: TypeWithMandatoryAndOptionalProps;
foo.blablabla; // string
foo.numberProp; // number
foo.boolProp; // boolean
<强> UPD 即可。我想我已经匆匆回答了一下。虽然建议的类型似乎解决了定义这种类型的问题,但仍然存在一些使用它的问题(由TS维护者在下面的评论中链接的问题中解释)。您可以尝试通过强制转换any
或使用Object.assign
为具有此类型的变量赋值来解决问题:
const foo = <TypeWithMandatoryAndOptionalProps><any>{/* ... */};
// or
const bar: TypeWithMandatoryAndOptionalProps = Object.assign(
{ numberProp: 1, boolProp: false },
{ blablabla: 'test' }
);
但这两个选项基本上都是技巧类型检查器,而不是为您的程序提供声音类型系统。
TL; DR的内容如下。除非您尝试使用现有JS程序的类型,否则只需重新考虑您的类型。对具有键签名的对象或Map
使用单独的属性。
感谢@jcalz指出TS问题。