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
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 lineResources
If you’re wanting to dig deeper into the concepts of TypeScript, I cannot recommend the following two resources enough.
