文章
TypeScript练习
基础练习
import React from 'react'
interface Shape {
name: string;
width: number;
height: number;
color?: string;
}
function area(shape: Shape) {
var area = shape.width * shape.height;
return "I'm " + shape.name + " with area " + area + " cm squared.";
}
var shape = {
name: "rectangle",
popup: function () {
console.log("This inside popup(): " + this.name);
setTimeout(() => {
console.log("This inside setTimeout(): " + this.name);
console.log("I'm a " + this.name + "!");
}, 3000);
}
}
class ShapeClass {
area: number;
color: string;
name: string;
width: number;
height: number;
constructor(name: string, width: number, height: number) {
this.area = width * height;
this.color = "pink";
this.name = name;
this.width = width;
this.height = height;
}
shoutout() {
return "I'm " + this.color + " " + this.name + " with an area of " + this.area + " cm squared";
}
}
class Shape3D extends ShapeClass {
volume: number;
constructor(public name: string, width: number, height: number, length: number) {
super(name, width, height);
this.volume = length * this.area;
}
shoutout(): string {
return "I'm " + this.name + " with a volume of " + this.volume + " cm cube.";
}
superShout() {
return super.shoutout();
}
}
function stringDemo() {
let name: string = "bob";
name = "smith";
let age = 17;
let sentence: string = `Hello, my name is ${name}
I'll be ${age + 1} years old next month.`;
console.log(sentence);
}
function listDemo() {
let list: number[] = [1, 2, 3];
let arr: Array<number> = [1, 2, 3];
}
function tupleDemo() {
let x: [string, number];
x = ["Hello", 10];
// x = [10, "Hello"];
console.log(x[0].substr(1));
// x[3] = 'world';
// console.log(x[5].toString());
// x[6] = true;
console.log(x);
}
function enumDemo() {
enum Color { Red = 1, Green = 2, blue = 4 };
let c: Color = Color.Green;
}
function anyDemo() {
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;
notSure = 4;
notSure.ifItExists();
notSure.toFixed();
let prettySure: Object = 4;
// prettySure.toFixed();
}
function asDemo() {
let someValue: any = "this is a string";
let strLenght: number = (someValue as string).length;
}
function f([first, second]: [number, number]) {
console.log(first);
console.log(second);
}
function parseDemo() {
let intput = [1, 2];
let [first, second] = intput;
console.log(first);
console.log(second);
f([first, second]);
let [start, ...rest] = [1, 2, 3, 4];
console.log(start);
console.log(rest);
}
function parseObjDemo() {
let o = {
a: "foo",
b: 12,
c: "bar"
}
let { a, b } = o;
// new Name 理解:a 作为 newA
let { a: newA, b: newB } = o;
// 定义类型是在{}:后面
let { a: a1, b: b1 }: { a: string, b: number } = o;
// 默认值
}
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 Counter {
(start: number): string;
interval: number;
reset(): void;
}
function getCounter(): Counter {
let counter = function (start: number) { } as Counter;
counter.interval = 123;
counter.reset = function () { };
return counter;
}
class Control {
private state: any;
}
interface SelecteableControl extends Control {
select(): void;
}
class Button extends Control {
select() { };
}
class TextBox extends Control {
select() { };
}
class Image extends Control {
}
class Location {
select() { };
}
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
class Animal {
name: string;
constructor(theName: string) {
this.name = theName;
}
move(distanceInMeters: number = 0) {
console.log(`${this.name} moved ${distanceInMeters}m`);
}
}
class Snake extends Animal {
constructor(name: string) {
super(name);
}
move(distanceInMeters = 5) {
console.log("Slithering...");
super.move(distanceInMeters);
}
}
class Horse extends Animal {
constructor(name: string) {
super(name);
}
move(distanceInMeters = 45) {
console.log("Galloping");
super.move(distanceInMeters);
}
}
function Page() {
console.log(area({ name: "rectangle", width: 30, height: 15 }));
console.log(area({ name: "square", width: 30, height: 30, color: "blue" }));
shape.popup();
var square = new ShapeClass("square", 30, 30);
console.log(square.shoutout());
console.log("Area of Shape: " + square.area);
console.log("Name of Shape: " + square.name);
console.log("Color of Shape: " + square.color);
console.log("Width of Shape: " + square.width);
console.log("Height of Shape: " + square.height);
var cube = new Shape3D("cube", 30, 30, 30);
console.log(cube.shoutout());
console.log(cube.superShout());
stringDemo();
listDemo();
tupleDemo();
parseDemo();
parseObjDemo();
let mySquare = createSquare({ color: "black" });
console.log(mySquare);
let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;
console.log(c);
let greeter = new Greeter("World");
console.log(greeter.greet());
let sam = new Snake("Sammy the python");
let tom = new Horse("Tommy the palomino");
sam.move();
tom.move(34m);
return (
<div>page</div>
)
}
export default Page;基础练习2
import React from 'react'
class Grid {
// 在构造函数的参数前加上访问修饰符 public private
// TypeScript 会自动为你: 声明一个同名的类属性;并在构造函数内部将传入的参数值赋给该属性。
constructor(public scale: number) { }
static origin = { x: 0, y: 0 };
calculateDistanceFromOrigin(point: { x: number; y: number; }) {
let xDist = (point.x - Grid.origin.x);
let yDist = (point.y - Grid.origin.y);
return Math.sqrt(xDist * xDist + yDist * yDist) / this.scale;
}
}
abstract class Animal {
abstract makeSound(): void;
move(): void {
console.log("roaming the eaching...");
}
}
abstract class Department {
constructor(public name: string) { }
printName(): void {
console.log("Department name: " + this.name);
}
abstract printMeeting(): void;
}
class AccountingDepartment extends Department {
constructor() {
super("Accounting and Auditing");
}
printMeeting(): void {
console.log("The Accounting Department meets each Monday at 10am.")
}
generateReports(): void {
console.log("Generating accounting reports...");
}
}
function add(x: number, y: number): number {
return x + y;
}
function buildName(firstName: string, lastName?: string) {
if (lastName) {
return firstName + " " + lastName;
} else {
return firstName;
}
}
function restName(firstName: string, ...restOfName: string[]) {
return firstName + " " + restOfName.join(" ");
}
function identity<T>(arg: T) {
return arg;
}
function loggingIdentity<T>(arg: T[]): T[] {
console.log(arg.length);
return arg;
}
class GenericNumber<T> {
// (感叹号)放在属性名后面,叫做 “明确赋值断言”
// 我保证这个属性一定会在使用前被赋值,即使 TypeScript 无法静态检测到这一点,请不要报错。
zeroValue!: T;
add!: (a: T, b: T) => T;
}
interface Lengthwise {
length: number;
}
function loggingIdentity2<T extends Lengthwise>(arg: T): T {
console.log(arg.length);
return arg;
}
enum Direction {
Up = 1,
Down,
Left,
Right
}
interface Padder {
getPaddingString(): string;
}
class SpaceRepeatingPadder implements Padder {
constructor(private numSpaces: number) { }
getPaddingString(): string {
return Array(this.numSpaces + 1).join(" ");
}
}
class StringPadder implements Padder {
constructor(private value: string) { }
getPaddingString(): string {
return this.value;
}
}
function getRandomPadder() {
return Math.random() < 0.5 ?
new SpaceRepeatingPadder(4) :
new StringPadder(" ");
}
function Page() {
let someArray = [1, "string", false];
for (let entry of someArray) {
console.log(entry);
}
for (let i in someArray) {
console.log(i);
}
let pets = new Set(["Cat", "Dog", "Hamster"]);
for (let pet in pets) {
console.log(pet);
}
for (let pet of pets) {
console.log(pet);
}
let padder: Padder = getRandomPadder();
if (padder instanceof SpaceRepeatingPadder) {
padder;
}
if (padder instanceof StringPadder) {
padder;
}
let myGenericNumber = new GenericNumber<number>();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function (x, y) { return x + y };
let out = identity<string>("myString");
// let myAdd = function (x: number, y: number) { return x + y; };
let myAdd: (x: number, y: number) => number = function (x: number, y: number): number { return x + y };
let z = 100;
function addToZ(x: number, y: number) {
return x + y + z;
}
let result1 = buildName("Bob");
let result2 = buildName("Bob", "Adams");
let deck = {
suits: ["hearts", "spades", "clubs", "diamonds"],
cards: Array(52),
createCardPicker: function () {
// 箭头函数能保存函数创建时的this值,而不是调用时的值
return () => {
let pickedCard = Math.floor(Math.random() * 52);
let pickedSuit = Math.floor(pickedCard / 13);
return { suit: this.suits[pickedSuit], card: pickedCard % 13 };
}
}
}
let cartPicker = deck.createCardPicker();
let pickedCard = cartPicker();
let employeeName = restName("Bob", "Sam", "Kate", "Lucy");
console.log(employeeName);
let grid1 = new Grid(1.0);
let grid2 = new Grid(5.0);
console.log(grid1.calculateDistanceFromOrigin({ x: 10, y: 10 }));
console.log(grid2.calculateDistanceFromOrigin({ x: 10, y: 10 }));
let department: Department;
// department = new Department();
department = new AccountingDepartment();
department.printName();
department.printMeeting();
// department.generateReports();
return (
<div>Page</div>
)
}
export default Page;