我希望将对象的可分配类型限制为特定类型。例如,一个对象,其中所有键都必须具有number值,例如:
interface NumberMap {
[key: string]: number;
}
Run Code Online (Sandbox Code Playgroud)
这适用于强制执行值限制,但是随后我将无法确定map变量中实际存在哪些键。
const map: NumberMap = {
one: 1,
two: 2,
three: 3,
};
// no error, but incorrect, this key does *not* exist
const lol = map.weoiroweiroew;
// Also cannot do this
type MyKeys = keyof map;
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以在不丢失实现该签名的对象具有哪些键的信息的情况下强制执行索引签名?
既限制值又保留实现类型中实际包含哪些键的类型信息的唯一方法是使用通用辅助函数。该函数将强制对象字面量扩展接口,但它会推断对象字面量的实际类型:
interface NumberMap {
[key: string]: number;
}
function createNumberMap<T extends NumberMap>(v: T) {
return v;
}
const map = createNumberMap({
one: 1,
two: 2,
three: 3,
// no: '' // error
});
map.one //ok
map.no //error
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1940 次 |
| 最近记录: |