Just a quick post for helping to remember TypeScript syntax. This is not an explanation, a tutorial, or guidance. For that see the section below called Resources.
Primatives
// String
let myName: string = "Josey";
// Number
let favNumber: number = 13;
// Boolean
let isCool: boolean = false;
// Array
let favAnimals: string[] = ["cat", "dog", "all"];
Parameters
// Typical
function printToConsole(eventNumber: number, eventMessage: string) {
console.log(`LOG: ${eventNumber}: ${eventMessage}`);
}
Objects
Note: There are multiple ways to annotate an object. Each has an impact.
Inline
Pass object type directly or inline: gives verbose error that includes full object type.
export const multiplyTwoNumbers = (params: {
first: number;
second: number;
}) => {
return params.first * params.second;
};
Type
Named Type: represents anything from an object, to string, number, or boolean.
type MultiplyTwoNumbers = {
first: number;
second: number;
};
export const multiplyTwoNumbers = (params: MultiplyTwoNumbers) => {
return params.first * params.second;
};
Interface
Named Interface: Works with ojbects only for the most part.
interface MultiplyTwoNumbers {
first: number;
second: number;
}
export const multiplyTwoNumbers = (params: MultiplyTwoNumbers) => {
return params.first * params.second;
};
Optional
The ?
character makes a property or parameter optional. This means the property or parameter or object that is using the declared type.
interface MultiplyTwoNumbers {
first: number;
second?: number;
}
Using type | undefined
where type
is a primative can be used to ensure the value of that specific key/value pair do not need a value, but the key must still be sent and declared as undefined in that case.
type MultiplyNumbers = {
first: number;
second: number;
third: number | undefined;
};
export const multiplyTwoNumbers = (params: MultiplyNumbers) => {
return params.first * params.second;
};
multiplyTwoNumbers({ first: 5, second: 16, third: undefined });
Variable Interface Assigning
interface Animal {
id: number;
name: string;
legs: number;
}
const newAnimal: Animal = {
id: 334,
name: "Agnes",
legs: 4,
};
Union Types (Value Type Contraints)
interface Animal {
id: number;
name: string;
legs: 2 | 3 | 4;
}
Arrays, Combining Types
interface Animal {
id: number;
name: string;
legs: 2 | 3 | 4;
owners: Owner[];
}
interface Owner {
id: number;
firstName: string;
lastName: string;
}
const newAnimal: Animal = {
id: 334,
name: "Agnes",
legs: 4,
owners: [
{
id: 13,
firstName: "Josey",
lastName: "Howarth",
},
{
id: 69,
firstName: "Dan",
lastName: "Howarth",
},
],
};
Typing Function Returns
const makeAnimal = (): Animal => {
return {
id: 334,
name: "Agnes",
legs: 4,
owners: [
{
id: 13,
firstName: "Josey",
lastName: "Howarth",
},
{
id: 69,
firstName: "Dan",
lastName: "Howarth",
},
],
};
};
Promises
There are mutliple ways to do this.
interface Animal {
id: number;
name: string;
legs: 2 | 3 | 4;
}
// Promise Method
export const fetchAgnes = async (): Promise<Animal> => {
const data = await fetch("https://www.reallycoolapifakeaddress.com/api/animal/334").then((res)) => {
return res.json();
});
return data;
};
// Recommended methods for working with fetch
// Typing fetched response
export const fetchAgnes = async () => {
const data: Animal = await fetch("https://www.reallycoolapifakeaddress.com/api/animal/334").then((res)) => {
return res.json();
});
return data;
};
// Casting (assigning is safer than using casting)
export const fetchAgnes = async () => {
const data = await fetch("https://www.reallycoolapifakeaddress.com/api/animal/334").then((res)) => {
return res.json();
});
return data as Animal;
};
TypeScript Comments
// @ts-expect-error
/// Tells TS that an error should show on the next line
// @ts-ignore
/// Tells TS to ignore the next line
Resources
If you’re wanting to dig deeper into the concepts of TypeScript, I cannot recommend the following two resources enough.