Avoid using the type "never" when working with interface and class implementations in Typescript

I want to utilize the never type in TypeScript to ensure that I have covered all possible implementations of an interface. Check out the code snippet here.

interface MyInterface {
    a: string;
    b: number;
}

class MyClass1 implements MyInterface {
    a: string;
    b: number;

    constructor() { }
}

class MyClass2 implements MyInterface {
    a: string;
    b: number;

    constructor() { }
}

function foo(arg: MyInterface) {
    if (arg instanceof MyClass1) {

    } else if (arg instanceof MyClass2) {

    } else {
        assertNever(arg);
    }
}

function assertNever(value: never): never {
  throw Error(`Unexpected value '${value}'`);
}

However, I encountered an error stating: Argument of type 'MyInterface' is not assignable to parameter of type 'never'.

Any suggestions on how to resolve this issue?

Answer №1

If you want to ensure that all cases are handled, try using the method assertNever. The issue lies in needing a union of all possibilities instead of relying solely on interfaces. Since Typescript cannot determine all possible implementations for an interface, your type-guard will not be able to narrow down the parameter's type.

Try this approach:

function bar(input: MyClassA | MyClassB) {
    if (input instanceof MyClassA) {

    } else if (input instanceof MyClassB) {

    } else {
        assertNever(input);
    }
}

Answer №2

There seems to be a misunderstanding about the concept of "never."

According to information from the documentation

The never type is unique in that it is a subtype of every type and can be assigned to any type; however, no other type can be a subtype of, or assigned to, never (except for never itself). Even the any type cannot be assigned to never.

It's important to note that you cannot assign values to never. So if your type declaration is assertNever(value: never), an error will occur when trying to assign a variable using assertNever(arg);

To avoid this error, simply modify the declaration to assertNever(value: any): never. You could also specify a more specific type if needed.

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

tsconfig.json: No input files were detected in the configuration file

I am encountering an issue with my tsconfig.ts file where it says "No inputs were found in config file 'd:/self-study/Web/Learning/Express/tsconfig.json'. Specified 'include' paths were '["**/*"]' and 'exclude&a ...

Deep Dive into TypeScript String Literal Types

Trying to find a solution for implementing TSDocs with a string literal type declaration in TypeScript. For instance: type InputType = /** Comment should also appear for num1 */ 'num1' | /** Would like the TSDoc to be visible for num2 as well ...

Encountered a type error during project compilation: "Type '(e: ChangeEvent<{ value: string[] | unknown; }>) => void' error occurred."

I recently started working with react and I'm facing an issue with a CustomMultiSelect component in my project. When I try to call events in another component, I encounter the following error during the project build: ERROR: [BUILD] Failed to compile ...

Obtaining a Bearer token in Angular 2 using a Web

I am currently working on asp.net web api and I am looking for a way to authenticate users using a bearer token. On my login page, I submit the user information and then call my communication service function: submitLogin():void{ this.user = this.l ...

Using ngFor to display images with src attribute, merging information from two different properties within the loop

One issue I am facing involves an array with properties: export interface IGameTag{ name: string; relativePath: string; filename: string; } I understand that it is possible to include the filename in the relativePath like this: <div *ngFor=" ...

Search for a matching number asynchronously in an object that contains a set of numbers

I am looking to retrieve objects asynchronously based on their category. In other words, I want my products to be loaded asynchronously by category. Currently, I have a function named 'getProductByID' that searches for a product using its ID. ...

Is it safe to use subjects in Angular like this, or are there potential security concerns?

When I find myself needing to use a variable in multiple components that can change over time, I typically store that variable in a service and encapsulate the value in a Subject. This allows every component to receive updates when next is called on the Su ...

Discovering the ReturnType in Typescript when applied to functions within functions

Exploring the use of ReturnType to create a type based on return types of object's functions. Take a look at this example object: const sampleObject = { firstFunction: (): number => 1, secondFunction: (): string => 'a', }; The e ...

Deleting the access token stored in the cookie prior to making an axios request

I've been facing a challenge in a Vue project where the request headers have become too large for our servers to handle, resulting in 413 error codes. Using JWT bearer tokens, I can see that the token is included in the request as the Authentication ...

The index type '{id:number, name:string}' is not compatible for use

I am attempting to generate mock data using a custom model type that I have created. Model export class CategoryModel { /** * Properties */ public id : number; public name : string; /** * Getters */ get Id():number{ return this.id; ...

Accessing the id within both objects is proving to be a challenge for me

I'm facing an issue with accessing and posting values of the id within Position and Department in Angular. It seems like the id is not being accessed correctly. addEmployee.model.ts export class AddEmployee { Position: { id: string; }; De ...

RxJs will only consider the initial occurrence of a specific type of value and ignore any subsequent occurrences until a different type of value is encountered

I'm faced with a situation where I need to extract the first occurrence of a specific value type, followed by the next unique value of a different type. Let's break it down with an example: of(1,1,1,1,2,3,4) .pipe( // some operators ) .subsc ...

Creating a one-of-a-kind entry by adding a number in JavaScript

I am looking for a way to automatically add an incrementing number to filenames in my database if the filename already exists. For example, if I try to add a file with the name DOC and it is already present as DOC-1, then the new filename should be DOC-2. ...

Is it possible to use TypeScript or Angular to disable or remove arrow key navigation from a PrimeNG Table programmatically?

Is there a way to programmatically prevent left and right arrow key navigation in a PrimeNG Table with cell editing, without the need to modify the Table component source code? You can check out an example here: Angular Primeng Tableedit Demo code. I mana ...

How do you switch the chart type by clicking on the dropdown menu in Angular and TypeScript, using Highcharts?

Struggling to figure out how to change the chart type in an Angular component typescript file when clicking on a dropdown. Here's what I have so far: Any ideas why it's not working? onOptionsSelected(value:string){ console.log("the sele ...

Angular 4: Issue with Radiobutton values vanishing when another Radiobutton is selected

I have 3 radio buttons that are used to sort different data from an API. However, when I press one radio button, the value of the selected button disappears if another radio button is clicked. This issue can be seen in the screenshots here: https://i.sstat ...

What methods can TypeScript employ to comprehend this situation?

There's an interesting scenario when it comes to assigning a variable of type unknown to another variable. TypeScript requires us to perform type checking on the unknown variable, but how does TypeScript handle this specific situation? It appears that ...

Combining different sub types using the | symbol - Exploring the power of Union Types

I have a custom type called Entry which includes: export type Entry = { number: number position: number entryItem: Banana | Orange } Additionally, I have defined the following types for entryItem: Banana Type export type Banana = { number: number ...

Firebase functions are giving me a headache with this error message: "TypeError: elements.get is not

Encountering the following error log while executing a firebase function to fetch documents and values from the recentPosts array field. Error: Unknown error status: Error: Unknown error status: TypeError: elements.get is not a function at new HttpsEr ...

Encountered an "Error - ENOENT" message when attempting to create a lambda function using CDK

I have a Node.js project that serves as a lambda authorizer in AWS. The structure of the project is outlined below: /authorizer /lib -index.js -package.json -node_modules -package.lock.json Currently, I am developing a CDK in TypeScript to esta ...