Cara menggunakan javascript class extends

Traditional JavaScript uses functions and prototype-based inheritance to build up reusable components, but this may feel a bit awkward to programmers more comfortable with an object-oriented approach, where classes inherit functionality and objects are built from these classes. Starting with ECMAScript 2015, also known as ECMAScript 6, JavaScript programmers can build their applications using this object-oriented class-based approach. In TypeScript, we allow developers to use these techniques now, and compile them down to JavaScript that works across all major browsers and platforms, without having to wait for the next version of JavaScript.

Classes

Let’s take a look at a simple class-based example:

ts

class Greeter {

greeting: string;

 

constructor(message: string) {

this.greeting = message;

}

 

greet() {

return "Hello, " + this.greeting;

}

}

 

let greeter = new Greeter("world");

Try

The syntax should look familiar if you’ve used C# or Java before. We declare a new class

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

1. This class has three members: a property called

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

2, a constructor, and a method

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

3.

You’ll notice that in the class when we refer to one of the members of the class we prepend

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

4. This denotes that it’s a member access.

In the last line we construct an instance of the

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

1 class using

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

6. This calls into the constructor we defined earlier, creating a new object with the

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

1 shape, and running the constructor to initialize it.

Inheritance

In TypeScript, we can use common object-oriented patterns. One of the most fundamental patterns in class-based programming is being able to extend existing classes to create new ones using inheritance.

Let’s take a look at an example:

ts

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();

Try

This example shows the most basic inheritance feature: classes inherit properties and methods from base classes. Here,

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

8 is a derived class that derives from the

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9 base class using the

Slithering... Sammy the Python moved 5m. Galloping... Tommy the Palomino moved 34m.

0 keyword. Derived classes are often called subclasses, and base classes are often called superclasses.

Because

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

8 extends the functionality from

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9, we were able to create an instance of

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

8 that could both

Slithering... Sammy the Python moved 5m. Galloping... Tommy the Palomino moved 34m.

4 and

Slithering... Sammy the Python moved 5m. Galloping... Tommy the Palomino moved 34m.

5.

Let’s now look at a more complex example.

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

This example covers a few other features we didn’t previously mention. Again, we see the

Slithering... Sammy the Python moved 5m. Galloping... Tommy the Palomino moved 34m.

0 keywords used to create two new subclasses of

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9:

Slithering... Sammy the Python moved 5m. Galloping... Tommy the Palomino moved 34m.

8 and

Slithering... Sammy the Python moved 5m. Galloping... Tommy the Palomino moved 34m.

9.

One difference from the prior example is that each derived class that contains a constructor function must call

ts

class Animal {

public name: string;

 

public constructor(theName: string) {

this.name = theName;

}

 

public move(distanceInMeters: number) {

console.log(`${this.name} moved ${distanceInMeters}m.`);

}

}

Try

0 which will execute the constructor of the base class. What’s more, before we ever access a property on

ts

class Animal {

public name: string;

 

public constructor(theName: string) {

this.name = theName;

}

 

public move(distanceInMeters: number) {

console.log(`${this.name} moved ${distanceInMeters}m.`);

}

}

Try

1 in a constructor body, we have to call

ts

class Animal {

public name: string;

 

public constructor(theName: string) {

this.name = theName;

}

 

public move(distanceInMeters: number) {

console.log(`${this.name} moved ${distanceInMeters}m.`);

}

}

Try

0. This is an important rule that TypeScript will enforce.

The example also shows how to override methods in the base class with methods that are specialized for the subclass. Here both

Slithering... Sammy the Python moved 5m. Galloping... Tommy the Palomino moved 34m.

9 and

Slithering... Sammy the Python moved 5m. Galloping... Tommy the Palomino moved 34m.

8 create a

ts

class Animal {

public name: string;

 

public constructor(theName: string) {

this.name = theName;

}

 

public move(distanceInMeters: number) {

console.log(`${this.name} moved ${distanceInMeters}m.`);

}

}

Try

5 method that overrides the

ts

class Animal {

public name: string;

 

public constructor(theName: string) {

this.name = theName;

}

 

public move(distanceInMeters: number) {

console.log(`${this.name} moved ${distanceInMeters}m.`);

}

}

Try

5 from

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9, giving it functionality specific to each class. Note that even though

ts

class Animal {

public name: string;

 

public constructor(theName: string) {

this.name = theName;

}

 

public move(distanceInMeters: number) {

console.log(`${this.name} moved ${distanceInMeters}m.`);

}

}

Try

8 is declared as an

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9, since its value is a

Slithering... Sammy the Python moved 5m. Galloping... Tommy the Palomino moved 34m.

8, calling

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

1 will call the overriding method in

Slithering... Sammy the Python moved 5m. Galloping... Tommy the Palomino moved 34m.

8:

Slithering... Sammy the Python moved 5m. Galloping... Tommy the Palomino moved 34m.

Public, private, and protected modifiers

Public by default

In our examples, we’ve been able to freely access the members that we declared throughout our programs. If you’re familiar with classes in other languages, you may have noticed in the above examples we haven’t had to use the word

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

3 to accomplish this; for instance, C# requires that each member be explicitly labeled

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

3 to be visible. In TypeScript, each member is

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

3 by default.

You may still mark a member

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

3 explicitly. We could have written the

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9 class from the previous section in the following way:

ts

class Animal {

public name: string;

 

public constructor(theName: string) {

this.name = theName;

}

 

public move(distanceInMeters: number) {

console.log(`${this.name} moved ${distanceInMeters}m.`);

}

}

Try

ECMAScript Private Fields

With TypeScript 3.8, TypeScript supports the new JavaScript syntax for private fields:

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

This syntax is built into the JavaScript runtime and can have better guarantees about the isolation of each private field. Right now, the best documentation for these private fields is in the TypeScript 3.8 .

Understanding TypeScript’s tsclass Animal { #name: string; constructor(theName: string) { this.#name = theName; }} new Animal("Cat").#name;Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try8

TypeScript also has its own way to declare a member as being marked

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

8, it cannot be accessed from outside of its containing class. For example:

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

TypeScript is a structural type system. When we compare two different types, regardless of where they came from, if the types of all members are compatible, then we say the types themselves are compatible.

However, when comparing types that have

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

8 and

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

1 members, we treat these types differently. For two types to be considered compatible, if one of them has a

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

8 member, then the other must have a

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

8 member that originated in the same declaration. The same applies to

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

1 members.

Let’s look at an example to better see how this plays out in practice:

ts

class Animal {

private name: string;

constructor(theName: string) {

this.name = theName;

}

}

 

class Rhino extends Animal {

constructor() {

super("Rhino");

}

}

 

class Employee {

private name: string;

constructor(theName: string) {

this.name = theName;

}

}

 

let animal = new Animal("Goat");

let rhino = new Rhino();

let employee = new Employee("Bob");

 

animal = rhino;

animal = employee;

Type 'Employee' is not assignable to type 'Animal'. Types have separate declarations of a private property 'name'.2322Type 'Employee' is not assignable to type 'Animal'. Types have separate declarations of a private property 'name'.Try

In this example, we have an

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9 and a

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

6, with

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

6 being a subclass of

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9. We also have a new class

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

9 that looks identical to

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9 in terms of shape. We create some instances of these classes and then try to assign them to each other to see what will happen. Because

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9 and

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

6 share the

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

8 side of their shape from the same declaration of

ts

class Animal {

private name: string;

constructor(theName: string) {

this.name = theName;

}

}

 

class Rhino extends Animal {

constructor() {

super("Rhino");

}

}

 

class Employee {

private name: string;

constructor(theName: string) {

this.name = theName;

}

}

 

let animal = new Animal("Goat");

let rhino = new Rhino();

let employee = new Employee("Bob");

 

animal = rhino;

animal = employee;

Type 'Employee' is not assignable to type 'Animal'. Types have separate declarations of a private property 'name'.2322Type 'Employee' is not assignable to type 'Animal'. Types have separate declarations of a private property 'name'.Try

4 in

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9, they are compatible. However, this is not the case for

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

9. When we try to assign from an

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

9 to

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9 we get an error that these types are not compatible. Even though

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

9 also has a

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

8 member called

ts

class Person {

protected name: string;

constructor(name: string) {

this.name = name;

}

}

 

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

console.log(howard.getElevatorPitch());

console.log(howard.name);

Property 'name' is protected and only accessible within class 'Person' and its subclasses.2445Property 'name' is protected and only accessible within class 'Person' and its subclasses.Try

1, it’s not the one we declared in

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

9.

Understanding tsclass Animal { private name: string;  constructor(theName: string) { this.name = theName; }} new Animal("Cat").name;Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try1

The

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

1 modifier acts much like the

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

8 modifier with the exception that members declared

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

1 can also be accessed within deriving classes. For example,

ts

class Person {

protected name: string;

constructor(name: string) {

this.name = name;

}

}

 

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

console.log(howard.getElevatorPitch());

console.log(howard.name);

Property 'name' is protected and only accessible within class 'Person' and its subclasses.2445Property 'name' is protected and only accessible within class 'Person' and its subclasses.Try

Notice that while we can’t use

ts

class Person {

protected name: string;

constructor(name: string) {

this.name = name;

}

}

 

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

console.log(howard.getElevatorPitch());

console.log(howard.name);

Property 'name' is protected and only accessible within class 'Person' and its subclasses.2445Property 'name' is protected and only accessible within class 'Person' and its subclasses.Try

1 from outside of

ts

class Person {

protected name: string;

constructor(name: string) {

this.name = name;

}

}

 

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

console.log(howard.getElevatorPitch());

console.log(howard.name);

Property 'name' is protected and only accessible within class 'Person' and its subclasses.2445Property 'name' is protected and only accessible within class 'Person' and its subclasses.Try

8, we can still use it from within an instance method of

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

9 because

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

9 derives from

ts

class Person {

protected name: string;

constructor(name: string) {

this.name = name;

}

}

 

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

console.log(howard.getElevatorPitch());

console.log(howard.name);

Property 'name' is protected and only accessible within class 'Person' and its subclasses.2445Property 'name' is protected and only accessible within class 'Person' and its subclasses.Try

8.

A constructor may also be marked

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

1. This means that the class cannot be instantiated outside of its containing class, but can be extended. For example,

ts

class Person {

protected name: string;

protected constructor(theName: string) {

this.name = theName;

}

}

 

// Employee can extend Person

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

let john = new Person("John");

Constructor of class 'Person' is protected and only accessible within the class declaration.2674Constructor of class 'Person' is protected and only accessible within the class declaration.Try

Readonly modifier

You can make properties readonly by using the

ts

class Person {

protected name: string;

protected constructor(theName: string) {

this.name = theName;

}

}

 

// Employee can extend Person

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

let john = new Person("John");

Constructor of class 'Person' is protected and only accessible within the class declaration.2674Constructor of class 'Person' is protected and only accessible within the class declaration.Try

3 keyword. Readonly properties must be initialized at their declaration or in the constructor.

ts

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();

Try

0

Parameter properties

In our last example, we had to declare a readonly member

ts

class Person {

protected name: string;

constructor(name: string) {

this.name = name;

}

}

 

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

console.log(howard.getElevatorPitch());

console.log(howard.name);

Property 'name' is protected and only accessible within class 'Person' and its subclasses.2445Property 'name' is protected and only accessible within class 'Person' and its subclasses.Try

1 and a constructor parameter

ts

class Person {

protected name: string;

protected constructor(theName: string) {

this.name = theName;

}

}

 

// Employee can extend Person

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

let john = new Person("John");

Constructor of class 'Person' is protected and only accessible within the class declaration.2674Constructor of class 'Person' is protected and only accessible within the class declaration.Try

5 in the

ts

class Person {

protected name: string;

protected constructor(theName: string) {

this.name = theName;

}

}

 

// Employee can extend Person

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

let john = new Person("John");

Constructor of class 'Person' is protected and only accessible within the class declaration.2674Constructor of class 'Person' is protected and only accessible within the class declaration.Try

6 class. This is needed in order to have the value of

ts

class Person {

protected name: string;

protected constructor(theName: string) {

this.name = theName;

}

}

 

// Employee can extend Person

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

let john = new Person("John");

Constructor of class 'Person' is protected and only accessible within the class declaration.2674Constructor of class 'Person' is protected and only accessible within the class declaration.Try

5 accessible after the

ts

class Person {

protected name: string;

protected constructor(theName: string) {

this.name = theName;

}

}

 

// Employee can extend Person

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

let john = new Person("John");

Constructor of class 'Person' is protected and only accessible within the class declaration.2674Constructor of class 'Person' is protected and only accessible within the class declaration.Try

6 constructor is executed. Parameter properties let you create and initialize a member in one place. Here’s a further revision of the previous

ts

class Person {

protected name: string;

protected constructor(theName: string) {

this.name = theName;

}

}

 

// Employee can extend Person

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

let john = new Person("John");

Constructor of class 'Person' is protected and only accessible within the class declaration.2674Constructor of class 'Person' is protected and only accessible within the class declaration.Try

6 class using a parameter property:

ts

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();

Try

1

Notice how we dropped

ts

class Person {

protected name: string;

protected constructor(theName: string) {

this.name = theName;

}

}

 

// Employee can extend Person

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

let john = new Person("John");

Constructor of class 'Person' is protected and only accessible within the class declaration.2674Constructor of class 'Person' is protected and only accessible within the class declaration.Try

5 altogether and just use the shortened

ts

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();

Try

01 parameter on the constructor to create and initialize the

ts

class Person {

protected name: string;

constructor(name: string) {

this.name = name;

}

}

 

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

console.log(howard.getElevatorPitch());

console.log(howard.name);

Property 'name' is protected and only accessible within class 'Person' and its subclasses.2445Property 'name' is protected and only accessible within class 'Person' and its subclasses.Try

1 member. We’ve consolidated the declarations and assignment into one location.

Parameter properties are declared by prefixing a constructor parameter with an accessibility modifier or

ts

class Person {

protected name: string;

protected constructor(theName: string) {

this.name = theName;

}

}

 

// Employee can extend Person

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

let john = new Person("John");

Constructor of class 'Person' is protected and only accessible within the class declaration.2674Constructor of class 'Person' is protected and only accessible within the class declaration.Try

3, or both. Using

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

8 for a parameter property declares and initializes a private member; likewise, the same is done for

ts

class Animal {

#name: string;

constructor(theName: string) {

this.#name = theName;

}

}

 

new Animal("Cat").#name;

Property '#name' is not accessible outside class 'Animal' because it has a private identifier.18013Property '#name' is not accessible outside class 'Animal' because it has a private identifier.Try

3,

ts

class Animal {

private name: string;

 

constructor(theName: string) {

this.name = theName;

}

}

 

new Animal("Cat").name;

Property 'name' is private and only accessible within class 'Animal'.2341Property 'name' is private and only accessible within class 'Animal'.Try

1, and

ts

class Person {

protected name: string;

protected constructor(theName: string) {

this.name = theName;

}

}

 

// Employee can extend Person

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

let john = new Person("John");

Constructor of class 'Person' is protected and only accessible within the class declaration.2674Constructor of class 'Person' is protected and only accessible within the class declaration.Try

3.

Accessors

TypeScript supports getters/setters as a way of intercepting accesses to a member of an object. This gives you a way of having finer-grained control over how a member is accessed on each object.

Let’s convert a simple class to use

ts

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();

Try

08 and

ts

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();

Try

09. First, let’s start with an example without getters and setters.

ts

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();

Try

2

While allowing people to randomly set

ts

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();

Try

10 directly is pretty handy, we may also want enforce some constraints when

ts

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();

Try

10 is set.

In this version, we add a setter that checks the length of the

ts

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();

Try

12 to make sure it’s compatible with the max-length of our backing database field. If it isn’t we throw an error notifying client code that something went wrong.

To preserve existing functionality, we also add a simple getter that retrieves

ts

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();

Try

10 unmodified.

ts

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();

Try

3

To prove to ourselves that our accessor is now checking the length of values, we can attempt to assign a name longer than 10 characters and verify that we get an error.

A couple of things to note about accessors:

First, accessors require you to set the compiler to output ECMAScript 5 or higher. Downleveling to ECMAScript 3 is not supported. Second, accessors with a

ts

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();

Try

08 and no

ts

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();

Try

09 are automatically inferred to be

ts

class Person {

protected name: string;

protected constructor(theName: string) {

this.name = theName;

}

}

 

// Employee can extend Person

class Employee extends Person {

private department: string;

 

constructor(name: string, department: string) {

super(name);

this.department = department;

}

 

public getElevatorPitch() {

return `Hello, my name is ${this.name} and I work in ${this.department}.`;

}

}

 

let howard = new Employee("Howard", "Sales");

let john = new Person("John");

Constructor of class 'Person' is protected and only accessible within the class declaration.2674Constructor of class 'Person' is protected and only accessible within the class declaration.Try

3. This is helpful when generating a

ts

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();

Try

17 file from your code, because users of your property can see that they can’t change it.

Static Properties

Up to this point, we’ve only talked about the instance members of the class, those that show up on the object when it’s instantiated. We can also create static members of a class, those that are visible on the class itself rather than on the instances. In this example, we use

ts

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();

Try

18 on the origin, as it’s a general value for all grids. Each instance accesses this value through prepending the name of the class. Similarly to prepending

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

4 in front of instance accesses, here we prepend

ts

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();

Try

20 in front of static accesses.

ts

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();

Try

4

Abstract Classes

Abstract classes are base classes from which other classes may be derived. They may not be instantiated directly. Unlike an interface, an abstract class may contain implementation details for its members. The

ts

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();

Try

21 keyword is used to define abstract classes as well as abstract methods within an abstract class.

ts

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();

Try

5

Methods within an abstract class that are marked as abstract do not contain an implementation and must be implemented in derived classes. Abstract methods share a similar syntax to interface methods. Both define the signature of a method without including a method body. However, abstract methods must include the

ts

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();

Try

21 keyword and may optionally include access modifiers.

ts

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();

Try

6

Advanced Techniques

Constructor functions

When you declare a class in TypeScript, you are actually creating multiple declarations at the same time. The first is the type of the instance of the class.

ts

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();

Try

7

Here, when we say

ts

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();

Try

23, we’re using

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

1 as the type of instances of the class

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

1. This is almost second nature to programmers from other object-oriented languages.

We’re also creating another value that we call the constructor function. This is the function that is called when we

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

6 up instances of the class. To see what this looks like in practice, let’s take a look at the JavaScript created by the above example:

ts

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();

Try

8

Here,

ts

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();

Try

27 is going to be assigned the constructor function. When we call

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

6 and run this function, we get an instance of the class. The constructor function also contains all of the static members of the class. Another way to think of each class is that there is an instance side and a static side.

Let’s modify the example a bit to show this difference:

ts

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();

Try

9

In this example,

ts

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();

Try

29 works similarly to before. We instantiate the

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

1 class, and use this object. This we have seen before.

Next, we then use the class directly. Here we create a new variable called

ts

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();

Try

31. This variable will hold the class itself, or said another way its constructor function. Here we use

ts

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();

Try

32, that is “give me the type of the

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

1 class itself” rather than the instance type. Or, more precisely, “give me the type of the symbol called

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

1,” which is the type of the constructor function. This type will contain all of the static members of Greeter along with the constructor that creates instances of the

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

1 class. We show this by using

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

6 on

ts

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();

Try

31, creating new instances of

ts

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);

}

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

Try

1 and invoking them as before. It is also good to mention that changing static property is frowned upon, here

ts

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();

Try

39 has

ts

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();

Try

40 instead of

ts

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();

Try

41 on

ts

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();

Try

42.

Using a class as an interface

As we said in the previous section, a class declaration creates two things: a type representing instances of the class and a constructor function. Because classes create types, you can use them in the same places you would be able to use interfaces.

Apa itu extend pada java?

extends digunakan untuk mewariskan method dan property dari kelas induknya, sedangkan implements digunakan untuk mewariskan interface.

Apa itu constructor di javascript?

Konstruktor atau contructor pada Javascript adalah method spesial yang berfungsi untuk inisialisasi ketika pembuatan obyek. Konstruktor dipanggil segera setelah obyek baru dibuat. Ciri dari konstruktor adalah nama method sama persis dengan nama kelasnya.