【问题标题】:Typescript type inference, spread syntax and multiple type returnTypescript 类型推断、扩展语法和多类型返回
【发布时间】:2018-02-22 14:15:18
【问题描述】:
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 类型兼容?

【问题讨论】:

  • 这在我看来像是 TypeScript 中的一个错误。

标签: typescript type-inference spread-syntax


【解决方案1】:

您的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 中的一个错误。类似的issuefixed,但this case 似乎仍然存在。可能值得打开一个带有指向现有问题的链接的新问题。

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

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

希望有所帮助;祝你好运!

【讨论】:

  • 谢谢!我注意到如果我明确地将我的函数键入为extraSkills() : SkillProperty,它似乎可以解决编译问题。我想看看是否有其他解决方案来推断类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多