TypeScript Cheat Sheet - 快速参考指南,收录常用语法、命令与实践。
npm install typescript --save-dev
npm tsc
TypeScript is a superset of JavaScript that adds static typing, interfaces, and compile-time error checking. It compiles down to plain JavaScript.
let age: number = 25;
let name: string = 'Alice';
let isOnline: boolean = true;
let notSure: any = 'Could be anything';
let nothingHere: null = null;
let notDefined: undefined = undefined;
let symbolValue: symbol = Symbol('unique');
let bigIntValue: bigint = 9007199254740991n;
let numbers: number[] = [1, 2, 3];
let fruits: Array<string> = ['apple', 'banana'];
let mixed: (string | number)[] = ['one', 2, 'three'];
let person: [string, number];
person = ['John', 30]; // ✅
person = [30, 'John']; // ❌ Error
enum Direction {
Up = 1,
Down,
Left,
Right
}
let move: Direction = Direction.Up;
enum Status {
Success = 'SUCCESS',
Error = 'ERROR'
}
type ID = string | number;
let userId: ID = 123;
type Callback = () => void;
interface User {
name: string;
age: number;
isAdmin?: boolean; // optional
readonly id: number; // readonly
}
const user: User = { name: 'Bob', age: 25, id: 1 };
interface Animal {
name: string;
}
interface Dog extends Animal {
breed: string;
}
const dog: Dog = { name: 'Fido', breed: 'Labrador' };
function greet(name: string): string {
return `Hello, ${name}`;
}
const add = (a: number, b: number): number => a + b;
function log(message: string, userId?: string) {
console.log(message, userId ?? 'Guest');
}
function multiply(a: number, b: number = 2) {
return a * b;
}
function sum(...numbers: number[]): number {
return numbers.reduce((acc, curr) => acc + curr, 0);
}
function combine(a: number, b: number): number;
function combine(a: string, b: string): string;
function combine(a: any, b: any): any {
return a + b;
}
type Status = 'success' | 'error' | 'loading';
type UserInfo = { name: string };
type AdminInfo = { admin: boolean };
type AdminUser = UserInfo & AdminInfo;
type Alignment = 'left' | 'center' | 'right';
let align: Alignment = 'left';
function identity<T>(value: T): T {
return value;
}
let num = identity<number>(42);
let str = identity('Hello');
interface Lengthwise {
length: number;
}
function logLength<T extends Lengthwise>(arg: T): void {
console.log(arg.length);
}
interface GenericIdentityFn<T> {
(arg: T): T;
}
const myIdentity: GenericIdentityFn<number> = identity;
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
greet() {
console.log(`Hello, I'm ${this.name}`);
}
}
const alice = new Person('Alice');
alice.greet();
class Car {
public brand: string;
private speed: number;
protected year: number;
constructor(brand: string, speed: number, year: number) {
this.brand = brand;
this.speed = speed;
this.year = year;
}
}
abstract class Animal {
abstract makeSound(): void;
move(): void {
console.log('Moving...');
}
}
class Dog extends Animal {
makeSound() {
console.log('Woof!');
}
}
interface Vehicle {
start(): void;
}
class Bike implements Vehicle {
start() {
console.log('Bike starting...');
}
}
let someValue: unknown = 'Hello TypeScript';
let strLength: number = (someValue as string).length;
let input: string | null = null;
let result = input ?? 'Default';
const user = { profile: { name: 'Alice' } };
console.log(user.profile?.name); // Alice
console.log(user.address?.street); // undefined
namespace Utils {
export function log(msg: string) {
console.log(msg);
}
}
Utils.log('Hello');
// math.ts
export function add(a: number, b: number) {
return a + b;
}
// app.ts
import { add } from './math';
console.log(add(2, 3));
// logger.ts
export default class Logger {
log(msg: string) {
console.log(msg);
}
}
// main.ts
import Logger from './logger';
const logger = new Logger();
logger.log('Info');
async function fetchData(): Promise<string> {
return 'Data loaded';
}
fetchData().then(console.log);
interface User {
id: number;
name: string;
}
async function getUser(id: number): Promise<User> {
// Simulate fetch
return { id, name: 'User' };
}
interface Config {
readonly apiKey: string;
}
type Point = Record<'x' | 'y', number>;
const origin: Point = { x: 0, y: 0 };
function isString(value: any): value is string {
return typeof value === 'string';
}
function process(value: string | number) {
if (isString(value)) {
console.log(value.toUpperCase());
} else {
console.log(value.toFixed(2));
}
}
interface Dictionary {
[key: string]: string;
}
const dict: Dictionary = { hello: 'world' };
type Flags = { [K in 'option1' | 'option2']: boolean };
const flags: Flags = { option1: true, option2: false };
type NonNullable<T> = T extends null | undefined ? never : T;
type SafeString = NonNullable<string | null>; // string
let value: unknown;
value = 5; // OK
// console.log(value.length); // Error
let anyValue: any;
anyValue = 5;
console.log(anyValue.length); // No error, but risky
function throwError(msg: string): never {
throw new Error(msg);
}
function sealed(target: any) {
Object.seal(target);
Object.seal(target.prototype);
}
@sealed
class SealedClass {}
interface Todo {
title: string;
description: string;
completed: boolean;
}
// Partial
type PartialTodo = Partial<Todo>;
// Required
type RequiredTodo = Required<PartialTodo>;
// Pick
type TodoPreview = Pick<Todo, 'title' | 'completed'>;
// Omit
type TodoWithoutDesc = Omit<Todo, 'description'>;
// ReturnType
function f() {
return { x: 10, y: 3 };
}
type P = ReturnType<typeof f>;
// Parameters
type Params = Parameters<(a: number, b: string) => void>;
interface Person {
name: string;
age: number;
}
type PersonKeys = keyof Person; // "name" | "age"
const person = { name: 'Alice', age: 30 };
type PersonType = typeof person; // { name: string; age: number }
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
const max: number = 100;
if (max > 50) {
console.log('Large');
}
const isEven: boolean = 10 % 2 === 0 ? true : false;
const color: string = 'red';
switch (color) {
case 'red':
console.log('Stop');
break;
default:
console.log('Go');
}
for (let i: number = 0; i < 5; i++) {
console.log(i);
}
let count: number = 0;
while (count < 5) {
console.log(count++);
}
const arr: number[] = [1, 2, 3];
for (const num of arr) {
console.log(num);
}
const obj = { a: 1, b: 2 };
for (const key in obj) {
console.log(key);
}
const nums: number[] = [1, 2, 3];
// Map
const doubled: number[] = nums.map(n => n * 2);
// Filter
const evens: number[] = nums.filter(n => n % 2 === 0);
// Reduce
const sum: number = nums.reduce((acc, curr) => acc + curr, 0);
const readOnlyNums: ReadonlyArray<number> = [1, 2, 3];
// readOnlyNums.push(4); // Error
const set: Set<number> = new Set([1, 2, 3]);
set.add(4);
set.delete(1);
const map: Map<string, number> = new Map();
map.set('one', 1);
map.get('one'); // 1
const car: { type: string; mileage?: number } = {
type: 'Toyota'
};
interface StringArray {
[index: number]: string;
}
const myArray: StringArray = ['Bob', 'Fred'];
interface Square {
color: string;
width: number;
}
// const redSquare = { color: "red", width: 100, height: 100 }; // Error if strict
namespace Geometry {
export interface Point {
x: number;
y: number;
}
export function distance(p1: Point, p2: Point): number {
return Math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2);
}
}
// tsconfig.json { "compilerOptions": { "moduleResolution": "node" } }
try {
throw new Error('Oops');
} catch (e: unknown) {
if (e instanceof Error) {
console.log(e.message);
}
}
class CustomError extends Error {
constructor(message: string) {
super(message);
}
}
const [first, second]: [number, number] = [1, 2];
const { name: userName, age }: { name: string; age: number } = { name: 'Alice', age: 30 };
const arr1: number[] = [1, 2];
const arr2: number[] = [...arr1, 3, 4];
const greeting: string = `Hello, ${name}`;
const square = (x: number): number => x * x;
地址
Level 10b, 144 Edward Street, Brisbane CBD(Headquarter)Level 2, 171 La Trobe St, Melbourne VIC 3000四川省成都市武侯区桂溪街道天府大道中段500号D5东方希望天祥广场B座45A13号Business Hub, 155 Waymouth St, Adelaide SA 5000Disclaimer
JR Academy acknowledges Traditional Owners of Country throughout Australia and recognises the continuing connection to lands, waters and communities. We pay our respect to Aboriginal and Torres Strait Islander cultures; and to Elders past and present. Aboriginal and Torres Strait Islander peoples should be aware that this website may contain images or names of people who have since passed away.
匠人学院网站上的所有内容,包括课程材料、徽标和匠人学院网站上提供的信息,均受澳大利亚政府知识产权法的保护。严禁未经授权使用、销售、分发、复制或修改。违规行为可能会导致法律诉讼。通过访问我们的网站,您同意尊重我们的知识产权。 JR Academy Pty Ltd 保留所有权利,包括专利、商标和版权。任何侵权行为都将受到法律追究。查看用户协议
© 2017-2025 JR Academy Pty Ltd. All rights reserved.
ABN 26621887572