一个例子:
function doSomething(): { string, SomeClass } {
...
}
从使用编译器开始,似乎它将接受任何返回值,该返回值是具有任意数量的string
键和SomeClass
值的对象。
所以像这样:
{
"key1": someClass1,
"key2": someClass2,
...
}
我的理解是否正确?
--Update--
似乎我需要的注释是{ [key: string]: SomeClass }
不 - 函数签名意味着'此函数将返回一个具有string
和SomeClass
以及any
值的对象'。这意味着这将编译正常:
function doSomething(): { string, SomeClass } {
return {
string: false,
SomeClass: 1
}
}
它在功能上等同于:
function doSomething(): { string: any, SomeClass: any }
要查看它的真正含义,可以使用以下代码进行检查:
let a: { string, SomeClass };
let v: void = a;
编译器会告诉你:
Type '{ string: any; SomeClass: any; }' is not assignable to type 'void'.
因此,在这种情况下,string
和SomeClass
根本不是类型,它们是属性名称,它们的类型被推断为any
。打开--noImplicitAny
通常有助于澄清这一点。
如果你想要一个返回你描述的对象的函数,你应该做以下事情:
function doSomething(): { [key: string]: someClass } {
// Do your stuff
}
在someClasse
具有未知类型的情况下,您可以执行以下操作:
function doSomething(): { [key: string]: any } {
// Do your stuff
}
我希望这会对你有所帮助,祝你有个美好的一天
function doSomething(): { string, SomeClass } {
...
}
它实际上意味着:
function doSomething(): { string: any, SomeClass:any } {
...
}
并且可以提取以便清楚:
interface YourReturnType{
string: any;
SomeClass: any;
}
function doSomething(): YourReturnType {
...
}
如果要返回具有任意数量的SomeClass
的对象,则需要使用索引签名。
interface YourReturnType{
[key: string]: SomeClass
}
但是,请记住,您只能在此返回类型的SomeClass
中定义其他属性。
为了避免这种混淆,我建议你打开编译器选项noImplicitAny
,它不会让你编译你最初发布的代码。