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

Posted

技术标签:

【中文标题】Typescript 类型推断、扩展语法和多类型返回【英文标题】:Typescript type inference, spread syntax and multiple type return 【发布时间】: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 中的一个错误。 【参考方案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 中的一个错误。类似的issue 是fixed,但this case 似乎仍然存在。可能值得打开一个带有指向现有问题的链接的新问题。

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

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

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

【讨论】:

谢谢!我注意到如果我明确地将我的函数键入为extraSkills() : SkillProperty,它似乎可以解决编译问题。我想看看是否有其他解决方案来推断类型

以上是关于Typescript 类型推断、扩展语法和多类型返回的主要内容,如果未能解决你的问题,请参考以下文章

typeScript笔记

Typescript中的类型和泛型

3 TypeScript 语法特性

TypeScript中函数组合方法(链)的类型推断

TypeScript 学习笔记 — 类型推断和类型保护

javascript学习+Vue学习+项目开发