Typescript - 强制接口中其他属性的默认类型

时间:2017-10-29 19:20:18

标签: typescript

我有一个具有某些类型的属性的接口

interface dummyInterface {
    propA: string,
    propB: boolean,
    propC: number,
}

道具A到C是必需的,但此类型的对象还可以包含任意数量的任何名称的附加属性。但是,我想强制所有其他属性为string类型。我知道无法通过添加类似

的内容来完成
{
    .
    .
    .
    [additionalProp: string]: string
}

因为这会分别与PropBPropC booleannumber相矛盾。

有什么方法可以实现这个目标吗?

1 个答案:

答案 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问题。