// I många fall helt utbytbara
type Poet = {
born: number | string ;
name: string;
dead?: number
};
interface Poet {
born: number | string ;
name: string;
dead?: number;
}
interface BaseAdress {
fullname: string;
street: string;
city: string;
country: string;
}
interface AdressWithPhoneNumber extends BaseAdress {
phone: number;
}
interface IUser {
id: number;
name: string;
displayInfo(): void;
}
class User implements IUser {
id: number;
name: string;
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
displayInfo(): void {
console.log(`ID: ${this.id}, Name: ${this.name}`);
}
}
const user = new User(1, 'Alice');
user.displayInfo();
interface Person {
name: string;
}
interface Person {
age: number;
}
let person: Person = {
name: 'John',
age: 25
};
// En typ är antingen en typen eller den andra
type User = SuperUser | Admin;
// Kombinerar "ärver" typer
type SpecialDate = Date & { getReason(): string }
"For the most part, you can choose based on personal preference, and TypeScript will tell you if it needs something to be the other kind of declaration. If you would like a heuristic, use interface
until you need to use features from type
." - se TS-dokumentation
interface StringDictionary {
[index: string]: string;
}
const myDict: StringDictionary = {
prop1: "value1",
prop2: "value2"
};
myDict["prop3"] = "value3";
console.log(myDict.prop3); // Output: value3
Spara properties med dynamiska nycklar (keys)
enum CardSuit {
Clubs,
Diamonds,
Hearts,
Spades
}
// Sample usage
const card = CardSuit.Clubs;
// Safety
card = "not a member of card suit"; // Error : string is not assignable to type `CardSuit`
Ett sätt att organisera relaterad data.
enum Color {
Red, // 0
Green, // 1
Blue // 2
}
enum Color {
DarkRed = 3, // 3
DarkGreen, // 4
DarkBlue // 5
}
Har ett number associerat, men går också att ändra.
enum Color {
Red, // 0
Green, // 1
Blue // 2
}
interface Shape {
type: string;
color: Color[];
}
const chape : Shape = {
type: "circle",
color: [Color.Red, Color.Green, Color.Blue]
}
Kan exempelvis användas som uppräkning i interface
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?