从TypeScript中的函数返回对象(具有特定键,值类型)

时间:2017-02-02 21:26:12

标签: javascript typescript

假设我有一个需要返回StringMap<string, boolean>类型的函数。有效的示例返回值为:{"required": true}

现在,我已经阅读了一个教程(这对于哪个教程并不重要),你可以创建一个返回类型为{ [s: string]: boolean }的函数,这与上面的StringMap是相同的返回类型。

我不明白这两种返回类型是怎样的?第二个版本甚至有效吗?

  1. 我在TypeScript中看到的所有返回类型都只包含过去的类型,即boolean,number,any。例如function (): number {}。在我们的第二个版本中,我们使用s: string,这意味着我们给变量一个名称,并指定它的类型,我们如何突然允许变量名为s
  2. 最重要的是,我们将此字符串放在数组[s: string]中作为第二个版本中的键(因此键现在是一个数组)。 StringMap有一个字符串作为键。

2 个答案:

答案 0 :(得分:5)

语法与您的想法略有不同。它是定义字典\地图的独特语法。

{ [s: string]: boolean }表示:一个地图,其中包含一个带字符串类型的键,它的值是布尔值。 s完全没有意义,它可能是你想要的任何东西。

(那么为什么首先给它命名?我的猜测是在映射更复杂的类型时使代码更清晰。有时候你想要调用索引id,有时{ {1}}等等。)

更多信息here,索引类型就是您想要的。

在线打字稿手册并不是最友好的文档,但我认为它已经足够好了,我建议每个使用打字稿的人至少都要浏览它。特别是因为在2.0+中他们添加了一堆疯狂的\ awesome类型功能,如映射类型。

答案 1 :(得分:0)

类型{ [s: string]: boolean }定义了indexable type接口。

您看到的数组就是决定定义接口索引的语法。

据我所知,密钥的名称将被忽略,只有类型才是重要的。

此代码{ [s: string]: boolean }定义了一个可索引的接口,其中索引是字符串,值是布尔值。

我假设StringMap的定义如下:

export interface StringMap<T, U> = { [s: T]: U };

如果你问我,这有点多余(因为名字说它应该是一个字符串映射,所以键应该是字符串)。我会将IStringMap接口声明为:

export interface IStringMap<T> = { [key: string]: T };

TypeScript中的接口只定义对象的“形状”。前三个定义具有相同的形状,因此这是完全有效的:

function fn() : IStringMap<boolean> { 
    let myMap : StringMap<string, bool> = { };

    myMap["foo"] = true;
    myMap["bar"] = false;
    myMap["baz"] = true;

    return myMap;
}

let foo: { [bazzinga: string]: boolean }  = fn();