如何约束类型?

时间:2017-11-17 04:45:51

标签: typescript generics

我正在为哈希定义接口:

export interface Hash<ValType> {
    [key: string | number]: ValType;
}

此错误:

An index signature parameter type must be 'string' or 'number'. (parameter) key: string | number

然后我尝试了:

export interface Hash<KeyType extends number | string, ValType> {
    [key: KeyType]: ValType;
}

同样的错误。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

无法在索引器上使用通用键。相反,您需要为每个密钥类型创建一个接口:

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

export interface NumberHash<T> {
    [key: number]: T;
}

const x: StringHash<Example> = {};
const y: NumberHash<Example> = {};

希望您可以看到,如果通用密钥有效,它将不会为您节省任何费用非工作示例来演示

export interface Hash<TKey, T> {
    [key: TKey]: T;
}

const x: Hash<string, Example> = {};
const y: Hash<number, Example> = {};

如果这是可能的,那么每次引用string时,您所实现的所有内容都会移动到表达式numberHash中出现的位置。 (即它从NumberHash移动到Hash<number,)。

这已在issue #6641中讨论过。