Typescript中接口的任意属性的属性key为什么还要规定类型为string,我大疑惑

代码片段

interface Test{
  name: string;
  age: number;
  //可有可无
  sex?:boolean,
  //自定义key 任意值
  [propName:string]:any,
}

为什么propName还要规定为是string,难道还能有number,boolean,null,undefined,array,object,any,never的类型吗,离谱了吧?

在 JavaScript 中,对象的属性名只能是字符串或者符号类型,而不能是数字、布尔值等其他类型。因此,在 TypeScript 中定义任意属性时,需要指定属性 key 的类型为字符串,以保证类型的正确性。

当然,如果你确信属性 key 是某种特定类型,也可以使用该类型来作为属性 key 的类型,例如:

interface Person {
  name: string;
  age: number;
  [propName: number]: any;
}

但这样会比较少见,大部分情况下还是使用字符串类型来表示属性 key。

  • 这篇博客: typescript的基础语法中的 4.4 [propname:string]:any表示名称是string类型,值是任何类型都可以 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • interface Girl{
        name:string;
        age:number;
        bust:number;
        waistline?:number; //表示可选参数,
       [propname:string]:any
    }
    
    const girl={
        name:'大脚',
        age:18,
        bust:94,
        waistline:12,//这里有值或没值都可以
        sex:'女'
    }
    //把girl传递进来,符合Girl接口的模式
    const screenResume=(girl:Girl)=>{
        girl.age < 24 && girl.bust >= 90 && console.log(girl.name + '进入面试')
        girl.age >= 24 || girl.bust < 90 && console.log(girl.name + '你被淘汰')
    }
    const getResume=(girl:Girl)=>{
        console.log(girl.name + '年龄是' + girl.age)
        console.log(girl.name + '胸围是' + girl.bust)
        girl.waistline&&console.log(girl.name+'腰围是'+girl.waistline)
        girl.sex&&console.log(girl.name+'性别是'+girl.sex)
    }
    screenResume(girl)
    getResume(girl)