在Typescript中,两个花括号之间有两种类型的类型注释是什么意思?

问题描述 投票:1回答:4

一个例子:

function doSomething(): { string, SomeClass } {
 ...
} 

从使用编译器开始,似乎它将接受任何返回值,该返回值是具有任意数量的string键和SomeClass值的对象。

所以像这样:

{
 "key1": someClass1,
 "key2": someClass2,
  ...
}

我的理解是否正确?

--Update--

似乎我需要的注释是{ [key: string]: SomeClass }

typescript
4个回答
6
投票

不 - 函数签名意味着'此函数将返回一个具有stringSomeClass以及any值的对象'。这意味着这将编译正常:

function doSomething(): { string, SomeClass } {
  return {
    string: false,
    SomeClass: 1
  }
} 

它在功能上等同于:

function doSomething(): { string: any, SomeClass: any }

4
投票

要查看它的真正含义,可以使用以下代码进行检查:

let a: { string, SomeClass };

let v: void = a;

编译器会告诉你:

Type '{ string: any; SomeClass: any; }' is not assignable to type 'void'.

因此,在这种情况下,stringSomeClass根本不是类型,它们是属性名称,它们的类型被推断为any。打开--noImplicitAny通常有助于澄清这一点。


0
投票

如果你想要一个返回你描述的对象的函数,你应该做以下事情:

function doSomething(): { [key: string]: someClass } {
   // Do your stuff
}

someClasse具有未知类型的情况下,您可以执行以下操作:

function doSomething(): { [key: string]: any } {
   // Do your stuff
}

我希望这会对你有所帮助,祝你有个美好的一天


0
投票
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,它不会让你编译你最初发布的代码。

© www.soinside.com 2019 - 2024. All rights reserved.