Child class instance pointing to Parent class object

Here is an example using TypeScript:

interface Animal{
    eat():void;
    sleep():void;
}

class Mammal implements Animal{

    constructor(private name:string){
        console.log(this.name, "is alive");
    }

    eat(){
        console.log("Like a mammal");
    }

    sleep(){
        console.log("Like a mammal");
    }
}

class Dog extends Mammal{
    eat(){
        console.log("Like a dog")
    }
}

let m: Mammal = new Dog("Prisca"); // This seems correct
let d: Dog = new Mammal("abomination"); // This works too

For variable d, TypeScript uses Structural typing, so type Dog inherits properties from Mammal. Variable d can reference objects of type Mammal until a new property is added to type Dog.

In TypeScript, how can we prevent these pitfalls?

Answer №1

It's inevitable - structural typing is crucial in TypeScript for seamless integration with JavaScript and JSON. It comes as a small trade-off, stemming from TypeScript's core objective of enhancing JavaScript with types while maintaining full compatibility with existing code bases.

In your scenario, the only workaround would involve adding a unique feature to Dog that sets it apart from Mammal, or potentially transforming Mammal into an abstract class to prevent direct instantiation. This approach makes sense if you expect to create distinct instances like Dog, Cat, or Horse rather than just a generic Mammal.

As suggested by Titian and Estus, another simple solution to differentiate classes without significant runtime impact, if avoiding abstraction in Mammal, could be introducing a trivial private property:

private isDog: undefined;

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Exploring effective methods for debugging a Node.js project using TypeScript and Webpack within Visual Studio Code

The issue at hand is clearly stated in the title of this discussion. Directory structure: -source -app -tools Cache.ts Logger.ts databases.ts filesystem.ts library.ts runtime.ts -config filesystem.ts service.t ...

Phone Directive causing validation issues in Angular when attempting to paste a value into the control for formatting

In our current project, we are utilizing Angular 17 in conjunction with Reactive forms. A custom directive has been implemented to format the output to the US phone number format `111-222-3333`. However, an issue has arisen where when a number is copied in ...

Tips for navigating back to the previous component in React:

Greetings! I'm currently working on a simple CRUD example using React.Js and TypeScript. In my project, I have set up the following component hierarchy: -FetchNaselje --Modal ---AddNaselje It's structured such that AddNaselje is a child of Moda ...

An issue has occurred: Error - The specified NgModule is not a valid NgModule

Everything was working smoothly, but suddenly I encountered this error message while running ng serve. I haven't made any recent upgrades or changes to dependencies. Could someone please provide guidance on how to resolve this issue? ERROR in Error: ...

TS interfaces: Understanding the distinction between optional and mandatory properties

In this example, I am demonstrating TypeScript interfaces in a simple way: interface A: { id: number; email: string; } interface B extends A { login: string; password: string; } My goal is to have certain requirements when creating objects fr ...

Storing the subscription value retrieved from an API in a global variable

I am trying to find a way to make the data retrieved from an API accessible as a global variable in Typescript. I know that using subscribe() prevents this, so I'm looking for a workaround. Here is the API code: getResultCount(category:any):Obs ...

Angular 8: Implementing functionality for the Parent Component to detect when the User clicks outside of the Child Component Textbox

I am working on a scenario where I have a Parent Component and a Child Component containing a Formbuilder and a ZipCode textbox. Is there a way to notify the Parent Component when the user clicks out of the Child Component Textbox? I need to trigger some ...

Leveraging Typescript Generics for limiting the input parameter of a function

Issue I have developed a Typescript package to share types between my backend node firebase cloud functions and frontend React client that accesses them. Provided below are examples of the types: interface FirstFunctionInput { x: number } interface Sec ...

What is the best way to loop through an array that contains a custom data type

When I declared the type: export interface Type{ id: number; name: string; } I attempted to iterate over an array of this type: for(var t of types) // types = Type[] { console.log(t.id); } However, I encountered the following error message: ...

How can I properly define the type for an object in Typescript where the key is a string and the value is an array of objects?

let colors = { "red" : [ { title: "red", summary : "red is ...", image : "image of red", // optional link : "https:// ..." }, { ...

What is the process for adding connected entities in MikroORM?

I am encountering difficulties in inserting related elements into each other. I believe I may be approaching it incorrectly. Here is an example of how I am attempting to do so. Mikro does not appear to set the foreign key in the dec_declinaison table. /* ...

Leveraging TypeScript alongside body-parser to access properties within req.body

I'm currently developing a web application using TypeScript and integrating the body-parser middleware to handle JSON request bodies. I've encountered type errors while attempting to access properties on the Request.body object. For instance, wh ...

Troubleshooting: Why is the Array in Object not populated with values when passed during Angular App instantiation?

While working on my Angular application, I encountered an issue with deserializing data from an Observable into a custom object array. Despite successfully mapping most fields, one particular field named "listOffices" always appears as an empty array ([]). ...

Error encountered while building with Next.js using TypeScript: SyntaxError - Unexpected token 'export' in data export

For access to the code, click here => https://codesandbox.io/s/sweet-mcclintock-dhczx?file=/pages/index.js The initial issue arises when attempting to use @iconify-icons/cryptocurrency with next.js and typescript (specifically in typescript). SyntaxErr ...

Using a split string to destructure an array with a mix of let and const variables

There is a problem with TS: An error occurs stating that 'parsedHours' and 'parsedMinutes' should be declared as constants by using 'const' instead of 'prefer-const'. This issue arises when attempting to destructure ...

Dealing with request-specific or session-specific data in LoopBack 4

I am currently facing a challenge within our LoopBack4 application. We have implemented controllers and are using JWT for Authorization. In the token's payload, we include a list of rights granted to the requesting user. Additionally, we have added an ...

Issue TS2300: Redundant reference of 'Location' identifier

In my Location.ts file, there is a declaration: class Location { // ... } When I run tsc, it produces the following error message: 1 class Location { ../../../../usr/local/lib/node_modules/typescript/lib/lib.dom.d.ts:9249:11 9249 interface Lo ...

TypeScript: By providing a variable CLASS as an argument to a function, automatically determine the return type to be an object of the specified class without any additional information

I am looking to create a function that accepts actual class objects themselves as arguments (within an object containing multiple arguments), with the return type of the function being inferred to be an instance of the class provided as the argument. In t ...

Are there specific methods within the Window object for accessing and modifying keys?

Is there an official mechanism to set/get keys on the Window object besides directly assigning values with window.myValue = 'something'? I'm looking for a method similar to: window.setValue('myKey', 'myValue') window.get ...

Incorporating a Script into Your NextJS Project using Typescript

I've been trying to insert a script from GameChanger () and they provided me with this code: <!-- Place this div wherever you want the widget to be displayed --> <div id="gc-scoreboard-widget-umpl"></div> <!-- Insert th ...