javascript - finns det ett sätt att få typescript att upptäcka när jag returnerar undefined från en funktion?


Jag hoppades att TypeScript kanske kan upptäcka när en funktion kan returnera ett undefined-värde och varna mig. Jag försökte följande men redigeraren på TypeScripts webbplats visade inga varningar

class Test {

    get(key: string) :string{

        var hash = {'some-key': 1, 'some-other-key': 3};

        return hash[key]

    }    

}

Är det möjligt att få TypeScript att varna när en funktion ibland kan returnera ett undefined-värde när du uttryckligen har sagt att den bara ska returnera en viss typ?

Svar #1

TypeScript kontrollerar inte existensen av egenskapen när du använder hash[key] på samma sätt som när du använder hash.myKey. Så för att få kontroll vid design- och kompileringstid skulle du behöva ändra sättet du exponerar denna information för att tillåta koden att använda punkt-egenskapssyntaxen...

Så istället för:

class Test {
    get(key: string) :string{
        var hash = {'some-key': 1, 'some-other-key': 3};
        return hash[key];
    }    
}

var test = new Test();
test.get('myKey');

Du skulle kunna avslöja:

class Test {
    public hash = { someKey: 1, someOtherKey: 3};
}

var test = new Test();
test.hash.myKey; // you'll get a warning here

Detta fungerar bara om denna design är lämplig för vad du gör - men du kommer att få varningarna när du gör saker på detta sätt eftersom TypeScript kommer att skapa en anonym typ för hash och kommer att säkerställa att endast kända egenskaper används.

Uppdatering: Jag uppdaterade exemplen baserat på feedback. Det är värt att notera att även om användning av 'some-key' hindrar dig från att använda punktnotation (så det är definitivt värt att ta bort bindestrecket om du kan) - kommer du fortfarande att få kodkomplettering.

Svar #2

Det kanske inte hindrar dig från att av misstag returnera undefined, men din kod returnerar definitivt undefined vilket bevisas av:

class Test {

    get(key: string) :string{

        var hash = {'some-key': 1, 'some-other-key': 3};

        return hash[key]

    }    

}

var test = new Test();
alert(test.get("asdf"));

TypeScript skulle behöva stödja något som CodeContracts för att kunna göra det du frågar om.