如果对象有一个字符串索引,我们也可以按数字索引对象,因此编译器没有理由抛出一个错误数字。这是故意的。
declare let skeys: { [key: string]: number }
let v1 = skeys[0] // number
let v2 = skeys["0"] // number
declare let nkeys: { [key: number]: number }
let v3 = nkeys[0] // number
let v4 = nkeys["0"] // error
declare let snkeys: {
[key: number]: number;
[key: string]: string | number // The string index has to contain any value reuned by the number index
}
let v5 = snkeys[0] // number
let v6 = snkeys["0"] // string| number
class Test<T extends { [key: string]: any } & (keyof T extends string ? {} : "T must obnly have string keys") >{
private data!: T;
public getValue<K extends keyof T>(key: K): T[K] {
return this.data[key];
}
}
// the property is a string = ok
const okay = new Test<{ "aString": string }>();
// Error: Type '{ 0: string; }' does not satisfy the constraint '{ [key: string]: any; } & "T must only have string keys"'.
const shouldFail = new Test<{ 0: string }>();
注意
如果对的值没有任何其他约束
T
一个简单的
object
类型也可以
class Test<T extends object & (keyof T extends string ? {} : "T must only have string keys") >{ }