sandra-larsson
Educator Fullstack Developer Javascript at Chas Academy
Hur kan vi ange en typ som för varje returtyp motsvarar samma input-typ?? Utan union( string | number) eller any??
function convertToArray(input: string): string[] {
return [input]
}
convertToArray("hello world")
convertToArray(1) // Error: Argument of type '1'
// is not assignable to parameter of type 'string'.
Svar: Genom att använda en s.k generisk typ
En generisk typ är som ett funktionsargument fast för typer.
T är en konvention, kan egentligen heta vad som helst.
T härleds till att i första fallet vare en string och andra fallet till en number
function convertToArray<T>(input: T): T[] {
return [input]
}
convertToArray("hello world") //Ok!
convertToArray(1) // Ok!
... man kan också använda sig av fler generiska typer på en och samma gång
function createArrayPair<T,K>(input1: T, input2: K): [T, K]{
return [input1, input2];
}
createArrayPair(1, "a"); // [1, "a"]
Kan också användas i interfaces.
interface Burger<T> {
size: T
price: number
}
const meal: Burger<string> = {
size: "small",
price: 50
}
... och i klasser
class Burger<T> {
size: T
price: number
constructor(size: T, price: number) {
this.size = size
this.price = price
}
}
const burger1 = new Burger("small", 50)
const burger2 = new Burger(3, 50)
... man kan också "begränsa" en generic med extends
function convertToArray<T extends number | string >(input: T): T[] {
return [input]
}
convertToArray("hello world")
convertToArray(1)
... så vad är det bra med generics, egentligen?
Vi kan skapa typer från andra typer. Exempelvis:
// Kombinera typer
type typeC = typeA & typeC
// Eller med interface ...
Men hur kan vi ta bort eller flexibelt ändra till nya typer?
Här finns en uppsättning s.k utility types att använda
Vanliga utility types är:
men det finns många fler...
Narrowing är processen där typen av en variabel avgörs till en mer specifik typ. Ett sätt att göra detta är att använda typeof, d.v.s att använda en Typeguard.
function example(value: string | number) {
if (typeof value === 'string') {
return value.toUpperCase());
} else {
console.log(value.toFixed(2));
}
}
Men man kan "smala" ner på fler sätt. Exempelvis använda truthy/falsy values, in operatorn, instanceOf, equality ===
Vi följer exempel på Typescript dokumentationen!
By sandra-larsson