function add(x: number, y: number): number {
return x + y;
}
let add: (x: number, y: number) => number = function(x, y) {
return x + y;
};
let add: (x: number, y: number) => number = function(x: number, y: number): number {
return x + y;
};
let add = (x: number, y: number): number => x + y;
function buildName(firstName: string, lastName?: string): string {
if (lastName) {
return `${firstName} ${lastName}`;
}
return firstName;
}
buildName('John');
buildName('John', 'Doe');
function buildName(firstName: string, lastName = 'Doe'): string {
return `${firstName} ${lastName}`;
}
buildName('John');
buildName('John', 'Smith');
function sum(...numbers: number[]): number {
return numbers.reduce((total, n) => total + n, 0);
}
sum(1, 2, 3, 4, 5);
function reverse(x: string): string;
function reverse(x: number): number;
function reverse(x: string | number): string | number {
if (typeof x === 'string') {
return x.split('').reverse().join('');
}
return Number(x.toString().split('').reverse().join(''));
}
reverse('hello');
reverse(12345);
interface User {
name: string;
greet(this: User): void;
}
let user: User = {
name: 'John',
greet() {
console.log(`Hello, ${this.name}`);
}
};
user.greet();
let greet = user.greet;
function identity<T>(arg: T): T {
return arg;
}
identity<string>('hello');
identity<number>(123);
identity(true);
function fetchData(callback: (data: string) => void): void {
setTimeout(() => {
callback('data');
}, 1000);
}
fetchData((data) => {
console.log(data);
});
type MathFunc = (x: number, y: number) => number;
let add: MathFunc = (x, y) => x + y;
let subtract: MathFunc = (x, y) => x - y;
interface ClockConstructor {
new (hour: number, minute: number): ClockInterface;
}
interface ClockInterface {
tick(): void;
}
function createClock(
ctor: ClockConstructor,
hour: number,
minute: number
): ClockInterface {
return new ctor(hour, minute);
}