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相同的属性这是如何工作的?如果将对象内联,它将不起作用。它是内联类型定义,而不是内联对象。在中运行良好。这看起来是您设置的,因此函数接受类型参数,但您没有给它类型参数。你介意解释一下你在这里做什么吗?非常感谢。