代码之家  ›  专栏  ›  技术社区  ›  LazyHatIQ

类型脚本类型推断、扩展语法和多类型返回

  •  1
  • LazyHatIQ  · 技术社区  · 7 年前
    interface SkillProperty {
        [name: string] : number 
    };
    
    let skills: SkillProperty;
    
    skills = {}; // ok
    
    skills = { fire: 123 }; // ok
    
    skills = {
        ...skills, // ok
        ...{}, // ok
        ...extraSkills() // {} | { ice: number } is not assignable to type 'SkillProperty'.
    }
    
    function extraSkills() {
        if (whatever) {
            return {};
        }
        return { ice: 321 };
    }
    

    我怎样才能改变我的 SkillProperty

    1 回复  |  直到 6 年前
        1
  •  0
  •   jcalz    7 年前

    你的 SkillProperty 界面 实际上与兼容 {} | {ice: number}

    let noSkills = {}
    let iceSkills = { ice: 321 };
    let randomSkills: {} | {ice: number} = (Math.random() < 0.5) ? noSkills : iceSkills
    let maybeSkills: SkillProperty = randomSkills; // no error
    

    在我看来,这就像是TypeScript中的一个bug。类似的 issue fixed this case 似乎持续存在。也许值得打开一个新的问题,并将其链接到现有的问题。

    同时还有一些变通方法,如:

    skills = {
      ...skills, // ok
      ...{}, // ok
      ...extraSkills() as SkillProperty // okay now
    }