用TypeScript输入一个约束字典
Typing a constrained dictionary with TypeScript
我有一个TypeScript 2.0项目,我想使用Immutable.js
定义一个不可变的Map。特别地,我想将Map的键约束为一个已知集合;如下所示:
type ConstrainedKeys = 'foo' | 'bar' | 'baz';
interface INameValuePair {
name: string;
value: string;
};
const dictionary = Immutable.Map<ConstrainedKeys, NameValuePair>(response);
其中response
可能是这样的:
{
foo: {
name: 'foo',
value: 'typing is fun'
}
}
但是当我尝试引用dictionary.foo.value
时,我得到Typescript错误:
[ts]属性'foo'在类型'Map<ConstrainedKeys,INameValuePair>'上不存在。
Immutable.Map
实例没有条目的属性,您需要像这样访问它们:
let foo = dictionary.get("foo");
如果你想能够像dictionary.foo
那样访问它,那么你需要自己更改实例,或者你可以使用代理:
const map = Immutable.Map<ConstrainedKeys, INameValuePair>({
foo: {
name: 'foo',
value: 'typing is fun'
}
});
const dictionary = new Proxy(map, {
get: (target: Immutable.Map<ConstrainedKeys, INameValuePair>, name: ConstrainedKeys) => {
if ((target as any)[name]) {
return (target as any)[name];
}
return target.get(name);
}
}) as Immutable.Map<ConstrainedKeys, INameValuePair> & { foo: INameValuePair };
console.log(dictionary.foo); // {name: "foo", value: "typing is fun"}
console.log(dictionary.get("foo")); // {name: "foo", value: "typing is fun"}
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- jQuery:循环一个具有不同超时值的循环
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 从javascript创建一个列表
- 节点导出返回一个空对象
- 使用clickToggle并在单击另一个元素时关闭元素
- 我可以在json对象中添加一个函数吗
- 使用javascript将动态表从一个html页面打印到另一个html页
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 表追加而不附加最后一个元素
- 我如何找到一个句子中的所有空格并替换忽略它们
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何在android中使用phonegap将文件从一个文件夹移动/复制到另一个文件夹
- 使用类从一个标记中双击事件
- Javascript,访问一个主要对象模块模式中的每个对象
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 三.js约束对象拖动到另一个对象的表面
- 用TypeScript输入一个约束字典
- 在一个元素上使用多个自定义验证约束