npm install -g typescript
let isDone: boolean = false ;
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
let color: string = " blue" ;
color = ' red' ;
let list: number[] = [1, 2, 3];
let list: Array< number> = [1, 2, 3];
let x: [string, number];
x = [" hello" , 10]; // OK
x = [10, " hello" ]; // Error
enum Color {Red, Green, Blue}
let c: Color = Color.Green;
let notSure: any = 4;
notSure = " maybe a string instead" ;
notSure = false ; // okay, definitely a boolean
function warnUser(): void {
console.log(" This is my warning message" );
}
let u: undefined = undefined;
let n: null = null;
function error(message: string): never {
throw new Error(message);
}
declare function create(o: object | null): void;
create({ prop: 0 });
create(null);
let someValue: any = " this is a string" ;
let strLength: number = (< string> someValue).length;
let someValue: any = " this is a string" ;
let strLength: number = (someValue as string).length;
interface LabelledValue {
label: string;
}
function printLabel(labelledObj: LabelledValue) {
console.log(labelledObj.label);
}
let myObj = {size: 10, label: " Size 10 Object" };
printLabel(myObj);
interface SquareConfig {
color? : string;
width? : number;
}
function createSquare(config: SquareConfig): {color: string; area: number} {
let newSquare = {color: " white" , area: 100};
if (config.color) {
newSquare.color = config.color;
}
if (config.width) {
newSquare.area = config.width * config.width;
}
return newSquare;
}
interface Point {
readonly x: number;
readonly y: number;
}
let p1: Point = { x: 10, y: 20 };
p1.x = 5; // Error
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet () {
return " Hello, " + this.greeting;
}
}
let greeter = new Greeter(" world" );
class Animal {
move(distanceInMeters: number = 0) {
console.log(` Animal moved ${distanceInMeters} m.` );
}
}
class Dog extends Animal {
bark () {
console.log(' Woof! Woof!' );
}
}
const dog = new Dog ();
dog.bark ();
dog.move(10);
dog.bark ();
Public, private, and protected modifiers
class Animal {
private name: string;
public constructor(theName: string) { this.name = theName; }
public move(distanceInMeters: number) {
console.log(` ${this.name} moved ${distanceInMeters} m.` );
}
}
function add(x: number, y: number): number {
return x + y;
}
let myAdd = function(x: number, y: number): number { return x + y; };
Optional and Default Parameters
function buildName(firstName: string, lastName? : string) {
if (lastName)
return firstName + " " + lastName;
else
return firstName;
}
function buildName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" " );
}
function identity<T>(arg: T): T {
return arg;
}
let output = identity< string>( " myString" ) ;
let output = identity(" myString" ); // type argument inference
class GenericNumber< T> {
zeroValue: T;
add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber<number> ();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };
enum Direction {
Up = 1,
Down,
Left,
Right
}
enum Direction {
Up = " UP" ,
Down = " DOWN" ,
Left = " LEFT" ,
Right = " RIGHT"
}
export interface StringValidator {
isAcceptable(s: string): boolean;
}
export const numberRegexp = /^[0-9]+$/;
export class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
import { ZipCodeValidator } from " ./ZipCodeValidator" ;
let myValidator = new ZipCodeValidator ();
let x = 3; // inferred to be number
let x = [0, 1, null]; // inferred to be (number | null)[]
interface Person {
name: string;
}
interface Contact {
email: string;
}
type Employee = Person & Contact;
let employee: Employee = {
name: ' John Doe' ,
email: ' [email protected] '
};
function padLeft(value: string, padding: number | string) {
if (typeof padding === " number" ) {
return Array(padding + 1).join(" " ) + value;
}
if (typeof padding === " string" ) {
return padding + value;
}
throw new Error(` Expected string or number, got ' ${padding}' .` );
}
function isNumber(x: any): x is number {
return typeof x === " number" ;
}
function isString(x: any): x is string {
return typeof x === " string" ;
}
let s: string | null = " foo" ;
s = null; // OK
s = undefined; // Error
interface Todo {
title: string;
description: string;
}
function updateTodo(todo: Todo, fieldsToUpdate: Partial< Todo> ) {
return { ...todo, ...fieldsToUpdate };
}
const todo1 = {
title: " organize desk" ,
description: " clear clutter"
};
const todo2 = updateTodo(todo1, {
description: " throw out trash"
});
interface Todo {
title: string;
}
const todo: Readonly< Todo> = {
title: " Delete inactive users"
};
todo.title = " Hello" ; // Error: cannot reassign a readonly property
interface PageInfo {
title: string;
}
type Page = " home" | " about" | " contact" ;
const x: Record< Page, PageInfo> = {
home: { title: " Home" },
about: { title: " About" },
contact: { title: " Contact" }
};
interface Todo {
title: string;
description: string;
completed: boolean;
}
type TodoPreview = Pick< Todo, " title" | " completed" > ;
const todo: TodoPreview = {
title: " Clean room" ,
completed: false
};
interface Todo {
title: string;
description: string;
completed: boolean;
}
type TodoPreview = Omit< Todo, " description" > ;
const todo: TodoPreview = {
title: " Clean room" ,
completed: false
};