基本上我想确保一个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; }'.
答案 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
的通配符字段