你能声明一个允许打字稿中未知属性的对象文字类型吗?

时间:2017-03-10 17:05:13

标签: generics typescript typescript2.0 object-literal

基本上我想确保一个object参数包含所有必需的属性,但是可以包含它想要的任何其他属性。例如:

function foo(bar: { baz: number }) : number {
    return bar.baz;
}

foo({ baz: 1, other: 2 });

但结果是:

Object literal may only specify known properties, and 'other' does not exist in type '{ baz: number; }'.

4 个答案:

答案 0 :(得分:8)

是的,你可以。试试这个:

interface IBaz {
    baz: number;
    [key: string]: any;
}

function foo(bar: IBaz) : number {
    return bar.baz;
}

foo({ baz: 1, other: 2 });

答案 1 :(得分:2)

通过在函数调用之前定义对象,可以很容易地实现这一点:

function foo(bar: { baz: number }) : number {
    return bar.baz;
}

const obj = { baz: 1, other: 2 };

foo(obj);

答案 2 :(得分:2)

好吧,我讨厌回答我自己的问题,但其他答案却引发了一些想法......这很有效:

function foo<T extends { baz: number }>(bar: T): void {
    console.log(bar.baz);
}

foo({baz: 1, other: 2});

答案 3 :(得分:1)

如果已知字段来自通用类型,允许通配符的方式是T & {[key: string]: unknown},则任何已知字段都必须符合该类型的约束,并且允许其他字段(并且考虑为类型{{1} })

以下是示例:

unknown

然后,如果您具有通用类型type WithWildcards<T> = T & { [key: string]: unknown }; function test(foo: WithWildcards<{baz: number}>) {} test({ baz: 1 }); // works test({ baz: 1, other: 4 }); // works test({ baz: '', other: 4 }); // fails since baz isn't a number ,则可以允许使用T的通配符字段