2017-09-13 128 views
1
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接口以使其符合空对象和我的实际SkillProperty类型?打字稿类型推断,展开运算符和多种类型返回

+0

这看起来像是TypeScript中的一个bug。 – jcalz

回答

0

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 

所以,这看起来像在打字稿给我的错误。类似的issuefixed,但this case似乎仍然存在。通过与现有链接的链接来开启一个新问题可能是值得的。

在平均时间也有变通办法,如:

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

希望帮助;祝你好运!

+0

谢谢!我注意到,如果我明确地键入我的函数为'extraSkills():SkillProperty',它似乎解决了编译问题。我想看看是否有另一种解决方案来推断这种类型 – LazyHatIQ