假设我有一个需要返回StringMap<string, boolean>
类型的函数。有效的示例返回值为:{"required": true}
。
现在,我已经阅读了一个教程(这对于哪个教程并不重要),你可以创建一个返回类型为{ [s: string]: boolean }
的函数,这与上面的StringMap是相同的返回类型。
我不明白这两种返回类型是怎样的?第二个版本甚至有效吗?
function (): number {}
。在我们的第二个版本中,我们使用s: string
,这意味着我们给变量一个名称,并指定它的类型,我们如何突然允许变量名为s
?[s: string]
中作为第二个版本中的键(因此键现在是一个数组)。 StringMap有一个字符串作为键。答案 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();