索引签名

在js中ES6答应用表达式作为目标的特点名,可是必定要将表达式放在方括号内。会把表达式使用toString()办法,这样js中目标和函数等也可以作为索引。而ts 做了进一步的束缚,索引类型只能是:string|number|symbol,而value可以是恣意类型

索引签名的称号如[index:number]:string里的index仅仅占位符并无任何意义,可以是恣意单词

索引签名就是在束缚了索引(key)类型的基础上,统必界说了目标的keyvalue的类型。换句话说,索引签名可以在只知道keyvalue的类型下,来统必界说目标的类型

当声明一个索引签名后,一切成员的key和value都有必要契合索引签名

interface Sign1 {
  // key 仅仅占位符
  [key: string]: string;
}
type Sign2 = {
  [index: number]: string | number;
};
const foo: {
  [aaa: string]: { message: string }; // value 只能是1个目标,并且只有1个特点 message
} = {};

界说了索引签名,那么确认特点和可选特点的类型都有必要是它的类型的子集

type attentionType{
    name: string; // 编译经过
    age?: number; // 编译报错:类型“number | undefined”的特点“age”不能赋给“string”索引类型“string”。ts(2411)
    sex?: undefined; // 编译经过
    [propName: string]: string | undefined;
}

在多个索引签名存在时,string类型的索引最严格,书写时应该包括一切的 value 类型。其他类型的索引,对应的 value 类型只能是string类型的value类型的子级

interface Sign3 {
    [key: string]: string | number | boolean;// 有必要包括所用成员类型
    [index: symbol]: string; 
    [index2: number]: number; 
}
interface Animal {
  name: string;
}
interface Dog extends Animal {
  breed: string;
}
interface NotOkay {
  [x: string]: Dog;
  [x: number]: Animal; // Error
}
interface Okay {
  [x: string]: Animal;
  [x: number]: Dog; // OK
}

索引签名