Generics 您可以声明一个允许typescript中的未知属性的对象文字类型吗?

Generics 您可以声明一个允许typescript中的未知属性的对象文字类型吗?,generics,typescript,typescript2.0,object-literal,Generics,Typescript,Typescript2.0,Object Literal,本质上,我希望确保对象参数包含所有必需的属性,但可以包含它想要的任何其他属性。例如: 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; }'.

本质上,我希望确保对象参数包含所有必需的属性,但可以包含它想要的任何其他属性。例如:

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

这可以通过为函数参数定义类型定义来实现。下面是一个内联类型定义的示例:

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

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

foo(obj);

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

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

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

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

嗯,我讨厌回答我自己的问题,但是其他的答案激发了我一点思考。。。这项工作:

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

foo({baz: 1, other: 2});
函数foo(条形图:T):无效{ 控制台日志(bar.baz); } foo({baz:1,other:2});
如果已知字段来自泛型类型,则允许使用通配符的方法是使用
T&{[key:string]:unknown}
,任何已知字段必须符合类型的约束,并且允许使用其他字段(并且认为类型为
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
type WithWildcards=T&{[key:string]:unknown};
函数测试(foo:with通配符){}
测试({baz:1});//作品
测试({baz:1,other:4});//作品
测试({baz:'',其他:4});//失败,因为baz不是数字

然后,如果你有一个泛型类型
T
,你可以允许通配符字段带有
和通配符

我最初是这么想的,但想要内联的。。。(出于某种原因,我用括号而不是方括号把[key:string]部分搞糟了)…这条消息似乎产生了另一条类似这样的消息:Type。。。没有与使用typescript 2.3.4的类型“…”p相同的属性这是如何工作的?如果将对象内联,它将不起作用。它是内联类型定义,而不是内联对象。在中运行良好。这看起来是您设置的,因此函数接受类型参数,但您没有给它类型参数。你介意解释一下你在这里做什么吗?非常感谢。