【发布时间】:2018-03-30 19:13:09
【问题描述】:
我有一个来自 RXJS 库的通用方法(这里是简化的):
function Subject<T>(t: T):T {
return t;
}
我还有一个接口来声明我的应用程序值。 (可以添加键)
interface IState {
key1: number;
key2: string;
}
最后我有一个Store,它通过泛型函数包装器应用于具有实际值的IState 接口(泛型函数是RXJS 主题的别名)
let Store : IState= Subject<IState>({
key1: void 0,
key2: void 0,
})
好的,让我们添加 2 种从商店获取和设置的方法:
设置存储:
function set<T>(name: keyof IState, statePart: T) {
Store={
...Store,
[name]: statePart
};
用法:set<string>("key1", "3");
此功能运行良好,允许我只使用属于IState的有效密钥。这里没有错误。
但是看看Select 方法:
(调用应该是这样的:)
let myVal:number = select<number>("key1");
方法如下:
function select<T>(k: keyof IState): T {
return <T>Store[k]; // <-- error here
}
键入'字符串 | number' 不能转换为类型 'T'。类型 'number' 不能与类型 'T' 比较。
问题:
这是为什么呢?如果我删除 keyof :
function select<T>(k): T {
return <T>Store[k];
}
然后它会编译,但它没有任何意义,Store 是 Istate 的类型,Istate 包含 Istate 的键
为什么在没有 keyof 的情况下它可以工作,我该如何修复我的代码,以便 select 方法将强制只选择 Istate 的键?
【问题讨论】:
标签: javascript typescript