2017-09-13 7 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 }; 
    } 

Wie kann ich meine SkillProperty Schnittstelle ändern, um es mit dem beiden leeren Objekt konform zu machen und meinem eigentlichen SkillProperty Typ?Typoskript Typinferenz, Verbreitung Betreiber und mehrere Typ Rückkehr

+0

Das sieht aus wie ein Fehler in TypeScript für mich. – jcalz

Antwort

0

Ihre SkillProperty Schnittstelle ist tatsächlich kompatibel mit {} | {ice: number}:

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

Also, das wie ein Fehler in Typoskript mir aussieht. Eine ähnliche issue war fixed, aber this case scheint zu bestehen. Es könnte sich lohnen, ein neues Problem mit Links zu den bestehenden zu öffnen.

In der Zwischenzeit gibt es Workarounds, wie:

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

Hoffnung, die hilft; Viel Glück!

+0

Danke! Ich habe festgestellt, dass, wenn ich explizit meine Funktion als 'extraSkills(): SkillProperty' eintippe, das Problem der Kompilierung zu lösen scheint. Ich wollte sehen, ob es eine andere Lösung gibt, um auf den Typ zu schließen – LazyHatIQ