javascript - TypeScript genomför inte typkontroll för funktionsargument


Jag hade intrycket att TypeScript tillät dig att ta ett giltigt JavaScript-program och "tvinga" typer genom att göra några nyckelsymboler typ-säkra. Detta skulle sprida typerna genom alla användningar och få dig att uppdatera alla symbolsreferenser.

Detta verkar vara felaktigt. I följande exempel anropar makeDiv-funktionen en typad make-funktion utan att kontrollera parametertypen.

// strongly typed arguments
function make(tagName: string, className: string) {
    alert ("Make: " + className.length);
}

// no typing
function makeDiv(className) {
    // calling the typed function without type checking
    return make("div", className);
}

makeDiv("test"); 
makeDiv(6); // bang!

Missar jag något här? Finns det ett sätt att tvinga fram "striktare" typkontroll? Eller är detta ett designbeslut gjort av TypeScript-skaparna?

Svar #1

Detta är ett designbeslut. Allt som inte uttryckligen har en typ blir implicit av typen any. any är kompatibel med alla typer.

var x:any = 123;
x = "bang";

För att förhindra implicit typning av en variabel till any finns det en kompilatorflagga (--noImplicitAny) som började med TypeScript 0.9.1

Om du kompilerar med detta alternativ kommer din kod inte att kompilera om du inte gör följande:

// You need to explicitly mention when you want something to be of any type. 
function makeDiv(className:any) {
    // calling the typed function without type checking
    return make("div", className);
}

Relaterade artiklar