Different from Promise, Typescript allows the return of any other type

Is there a way to define a function type that can return any value except a Promise?

This is how my interface currently looks:

interface AnInterface {
    func(): AllowAnythingButAPromise;
}

I have attempted the following:

type AllowAnythingButAPromise<T> = T extends Exclude<any, Promise<any>> ? T: never;
type AllowAnythingButAPromise<T> = T extends Exclude<any, Promise<unknown>> ? T: never;
type AllowAnythingButAPromise<T> = T extends Promise<unknown> ? never : T;
type AllowAnythingButAPromise<T> = T extends Promise<any> ? never : T;


type anything = number | symbol | string | boolean | null | undefined | object | Function;
type AllowAnythingButAPromise<T> = T extends Exclude<anything, Function> ? T: never;

However, I haven't had success with this approach. Is it even possible to achieve what I am trying to do?

Answer №1

There is no direct way to implement negated types in TypeScript. However, there are workarounds that can help achieve similar functionality for certain use cases.

In this scenario, you could define a return type as a union of primitive types and an object type where the then property is optional with a type of undefined. This approach ensures that any value with a then property cannot be assigned to the return type. While this may be more restrictive than desired, it presents a viable compromise solution.

interface AnInterface {
    func(): number | boolean | string| symbol | { then?: never, [n: string]: unknown };
}

Playground Link

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

Using promises in TypeScript index signature

Can you help me find the correct index signature for this particular class? class MyClass { [index: string]: Promise<void> | Promise<MyType>; // not working public async methodOne (): Promise<void> { ... } public async methodTwo () ...

Utilizing an object as a prop within React-router's Link functionality

Looking for a solution to pass the entire product object from ProductList component to Product component. Currently, I am passing the id as a route param and fetching the product object again in the Product component. However, I want to directly send the ...

The type "AppRouterInstance" cannot be assigned to type "nextRouter"

Within my Next.js project, a registration form is included as seen below: "use client"; import * as React from "react"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form" ...

Popup appears on incorrect page

As part of my app development project, I implemented a popover feature that opens when clicking on a label. Initially, this functioned smoothly within a tab navigation setup. However, after transitioning from tab modules to the app-routing module to displa ...

Manage both the return of an observable and the setting of a value within a single method using

I am in need of a service that can both return an observable and set a value to a field within the same method. The current implementation of my userService.getUserDetails() method is as follows: private requestUrl: string; private bic: string; private i ...

Accessing data from an API in Angular and logging it in the console instead of displaying it on a frontend table

The data retrieved from the API is not being displayed on the screen, but I can see it in the console log. Below is the .ts file: export class VisibilityComponent implements OnInit { check = false; pmDetails1: IEmployee[]; constructor( priv ...

Converting an array of objects into a dictionary using TypeScript

I'm attempting to convert an array of objects into a dictionary using TypeScript. Below is the code I have written: let data = [ {id: 1, country: 'Germany', population: 83623528}, {id: 2, country: 'Austria', population: 897555 ...

What is the method for determining the type in this component configuration?

When working with a custom hook from React DnD, I encounter an issue where TypeScript restricts my access to the property of an item object in the drop function due to its unknown type. function MyComponent(props){ const [{item}, drop] = useDrop({ ...

Issues encountered while retrieving API payload in Reactjs using Typescript

Having some trouble storing an API payload in state, as I keep receiving the following error message: Error: Objects are not valid as a React child (found: object with keys {page, results, total_pages, total_results}). If you meant to render a collection ...

"Pairing AngularJS 2 with Vaadin for a winning combination

Good day, I'm currently following a tutorial but encountering some challenges with integrating Vaadin and Angularjs2 into my Joomla Backend project. The error message I am facing is as follows: polymer-micro.html:196 Uncaught TypeError: Cannot read ...

Generics-based conditional type that verifies entry properties

I developed a function that accepts an argument with two different architectures. I intentionally avoided enforcing rules to allow flexibility for the user, which is now causing me some headaches ...

Discover the most effective method for identifying duplicate items within an array

I'm currently working with angular4 and facing a challenge of displaying a list containing only unique values. Whenever I access an API, it returns an array from which I have to filter out repeated data. The API will be accessed periodically, and the ...

To switch to desktop mode, double click; for mobile view, just tap once

I am looking to implement 2 different gestures for a specific feature in my application. Ideally, I want users to be able to double click on a card to open it in desktop view, but if they are using a phone, a single tap should suffice. How can I achieve th ...

Creating an array with varying types for the first element and remaining elements

Trying to properly define an array structure like this: type HeadItem = { type: "Head" } type RestItem = { type: "Rest" } const myArray = [{ type: "Head" }, { type: "Rest" }, { type: "Rest" }] The number of rest elements can vary, but the first element ...

Can you provide guidance on effectively utilizing a Pinia store with Vue3, Pinia, and Typescript?

I'm currently facing challenges while using the Pinia store with TypeScript and implementing the store within a basic app.vue Vuejs3 option api. Here is my app.js file: import {createApp} from 'vue' import {createPinia} from "pinia&quo ...

Sending parameters to a function within the ngAfterViewInit() lifecycle method in Angular version 6

As a beginner in coding, I have created a canvas in Angular and am attempting to pass data received from my server to a function within ngAfterViewInit(). When I hard code the values I want to pass, everything works perfectly. However, if I try to pass da ...

Adding a feature to a React project

After importing the following code snippet into a test file: https://i.sstatic.net/i44pI.png Everything seems to be working fine. However, issues arise when trying to import it into another file—here is what I'm using: https://i.sstatic.net/dsBQu ...

Style the typescript file to mirror the layout of a C# Visual Studio 2015 document

I am looking to align the formatting of my typescript files with that of my C# code files. While I have managed to configure Visual Studio 2015 to place the open brace on a new line, I am struggling to ensure that my parameters are formatted consistently ...

TypeScript 1.6 warning: Component XXX cannot be instantiated or called as a JSX element

var CommentList = React.createClass({ render: function () { return ( <div className="commentList"> Hello there! I am the CommentList component. </div> ); } }); var ...

Error429 was received from a GET request made to the Imgur API

Encountering a Request failed with status code 429 error from the Imgur API despite using a new Client_ID that hasn't been used before, Here is my Api.ts: const imgurClientId = process.env.NEXT_PUBLIC_Client_ID const BASE = "https://api.imgur. ...