Obtain inferred type parameters using the TypeScript compiler API

I have a specific type and function signature that I'm working with:

type Constructor<T> = {
  new (): T
}

export function bar<T>(Constructor: Constructor<T>) {

}

class Foo { bar = 'example' }

bar(Foo) // the inferred type of T here should be Foo

I am attempting to obtain the inferred type of T at the point where bar(Foo) is called by utilizing the compiler API. My initial attempts include:

if (ts.isCallExpression(node)) { 
  const funcType = typeChecker.getTypeAtLocation(node.expression)
}

This, however, only retrieves the declared type of bar, but does not provide the type arguments passed to it at the call location. Another approach I tried is:

if (ts.isCallExpression(node)) { 
  const args = node.typeArguments
}

Unfortunately, this method turns out to be ineffective as well since the types are not explicitly specified.

So, my question remains: How can I retrieve the inferred type of T at each call site?

Answer №1

If you want to find out more about a particular signature, look at the resolved signature:

if (ts.isCallExpression(node)) {
  const signature = checker.getResolvedSignature(node);
  if (signature != null) {
    // this will show -- (Ctor: Ctor<Bar>): void
    console.log(checker.signatureToString(signature));
    const params = signature.getParameters();
    for (const param of params) {
      const type = checker.getTypeOfSymbolAtLocation(param, node);
      // this will show -- Ctor<Bar>
      console.log(checker.typeToString(type));
    }
  }
}

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

Angular modal not progressing past initial message due to Bootstrap integration issue

The modal functionality only seems to be working for the first message I send, as subsequent messages do not appear. My environment includes: Angular 17 Bootstrap 5.3 This is the TypeScript file snippet: import { Component } from '@angular/core&apos ...

When setting up a list in TypeScript, it does not verify the type of each element during initialization

In TypeScript, the code snippet below does not generate any error or warning, even though the 1st element does not adhere to the IFileStatus interface: interface IFileStatus { a: string; b: number; } let statuses: IFileStatus[] = [ { ...

What are some effective ways to utilize the data gathered from a subscribe() method in a different

handleKeyUp(event: any): void { this.technologiesService.retrieveData(event.target.value) .subscribe(data => { this.myResults = data; }); } The result of data is: https://i.sstatic.net/WjiD4.png I want to assign data as a property fo ...

A versatile sorting algorithm

Currently, I am working on converting the material UI sorting feature into a generic type. This will enable me to utilize it across various tables. However, I have hit a roadblock in implementing the stableSort function, which relies on the getSorting func ...

How can a nullable variable be converted into an interface in TypeScript?

Encountered an issue while working on a vue3.x typescript project. The vue file structure is as follows: <template> <Comp ref="compRef" /> </template> <script lang="ts" setup> import {ref} from "vue& ...

Updating object properties in Typescript

I have written the following Angular 2 TypeScript code: import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) ...

Why does isDisplayed method in Protractor return "No element found using locator" instead of a boolean value?

In my code, I've created a function called isElementDisplayed which features a call to element.isDisplayed. I'm curious as to why the isDisplayed method sometimes returns No element found instead of a boolean value. isElementDisplayed(element: ...

Adding a property during runtime to an object does not display in the current "this" context

Can anyone explain why the dynamic property added using Object.defineProperty does not show up when printing 'this' on the console? Here is a Decorator example. It seems to be working fine, but the success and error properties do not appear in & ...

BehaviorSubject Observable continuously notifies unsubscribed Subscription

Utilizing a service called "settings", initial persisted values are read and provided through an observable named "settings$" to components that subscribe to it. Many components rely on this observable to retrieve the initial values and exchange updated va ...

Production is experiencing a hiccup, however, the site is still up and running. There seems to be

Having an error in production that I can't seem to replicate on my local machine. The error message reads: src/controllers/userController.ts(2,29): error TS2307: Cannot find module '../services/UserService' or its corresponding type declarat ...

"Learn the process of extracting information from a database and exporting it to a CSV file with Angular 2

Currently, I am facing an issue where I need to retrieve data from a database and export it to a CSV file. While I am able to fetch all the data successfully, I am encountering difficulty when trying to fetch data that is in object format as it shows up as ...

TypeDoc fails to generate documentation for an Express JS API and displays no information

As I strive to document my Express JS API using TypeDoc, I am encountering an issue where the generated documentation is quite empty. https://i.sstatic.net/LRhOE.png This outlines my API file structure: https://i.sstatic.net/6zuXQ.png Below is a snippet ...

Please ensure the subscription has completed before proceeding with the loop

I am currently working on an Angular application that retrieves data from an API and uses one of its parameters from a looped array. The issue I'm facing is that the data is pushed in a random order due to the continuous looping without waiting for th ...

What is the best way to refresh a Component upon sending data to the server?

I'm in the process of developing a cross-platform application. I have a TabView Component that needs to update a tab after sending data to the server. During the initialization (ngOnInit) phase, I dynamically set the content of my tab. However, when I ...

Unable to locate the 'NodeJS' namespace along with node types

I encountered an error in my web application: ERROR in node_modules/zone.js/dist/zone.js.d.ts:600:21 - error TS2503: Cannot find namespace 'NodeJS'. 600 declare var global: NodeJS.Global; Even after adding the types": ["node"] pr ...

What are the steps for encountering a duplicate property error in TypeScript?

I'm currently working with typescript version 4.9.5 and I am interested in using an enum as keys for an object. Here is an example: enum TestEnum { value1 = 'value1', value2 = 'value2', } const variable: {[key in TestEnum]: nu ...

Visual Studio 2015 is struggling to locate a specific module, yet the command line interface for

Recently, I delved into the world of TypeScript in VS2015 and so far, it has been a smooth journey. I managed to establish a structure that compiled and performed as anticipated. However, things took a turn when I attempted to incorporate npm-installed mo ...

Issue with Angular ngFor binding. What could be causing this error to occur?

I have a main component called DOCUMENT. This document receives a URL segment and retrieves an array of associated objects from my database. Then, using @Output() documents = new EventEmitter() and an @Input() in a DOCUMENT VIEW component, I loop through t ...

In Typescript, an interface is defined where the "id" property is required to be a number, while all other properties must be of

I am in need of creating an interface to represent data received from the server, where the id is a number and all other properties are strings. This is what I attempted: interface AnyChartsData { id: number; [key: string]: string; } However, I enco ...

What is the reason behind receiving the error message "`Foo` only represents a type, but is being treated as a value here" when using `instanceof` in TypeScript?

As the creator of this code interface Foo { abcdef: number; } let x: Foo | string; if (x instanceof Foo) { // ... } Upon running this code, I encountered an error in TypeScript: 'Foo' is recognized only as a type and cannot be used a ...