有没有办法在不相关的情况下省略TypeScript中的类型参数?

2nc8po8w  于 2022-11-26  发布在  TypeScript
关注(0)|答案(2)|浏览(80)

我有这样一个函数:

function progress<T>(data: JsonApiQueryData<T>): number {
  const { links, meta } = data.getMeta();
  if (!links.next) {
    return 1;
  }

  const url = new URL(links.next);
  return parseInt(url.searchParams.get('page[offset]')) / meta.total;
}

其中JsonApiQueryData定义为:

export declare class JsonApiQueryData<T> {
    protected jsonApiModels: Array<T>;
    protected metaData: any;
    constructor(jsonApiModels: Array<T>, metaData?: any);
    getModels(): T[];
    getMeta(): any;
}

正如您从progress的主体中所看到的,我没有对底层T类型做任何事情,所以我 * 希望 * 能够从它中删除类型参数。
天真地试图这样做,就像这样:

function progress(data: JsonApiQueryData): number {
  ...
}

给了我一个不幸但并不奇怪的错误:

Generic type 'JsonApiQueryData<T>' requires 1 type argument(s).

更新

我应该在最初询问的时候澄清一下,但是JsonApiQueryData是一个库类型,我不能(轻易地)改变它。从我目前看到的(提示和相当好的)响应来看,达到 * 确切 * 我想要的最好方法是改变该类型(像class JsonApiQueryData<T = any>class JsonApiQueryData<T = unknown>)。抱歉我无意中移动了目标。

cuxqih21

cuxqih211#

您可以按如下方式定义类型:

export declare class JsonApiQueryData<T = unknown>

然后您可以定义不带任何类型注解的函数progress

function progress(data: JsonApiQueryData<unknown>): number {

代替

function progress<T>(data: JsonApiQueryData<T>): number {

但对你来说应该没问题。

ngynwnxp

ngynwnxp2#

您可以改用界面。

// interface declaration
export interface HasMetaData
{
    getMeta(): any;
}

// implment interface
export declare class JsonApiQueryData<T> implements HasMetaData {
    protected jsonApiModels: Array<T>;
    protected metaData: any;
    constructor(jsonApiModels: Array<T>, metaData?: any);
    getModels(): T[];
    getMeta(): any;
}

用法:

// no need of any generic type
function progress(data: HasMetaData): number {
  // accessing getMeta through HasMetaData
  const { links, meta } = data.getMeta();
  if (!links.next) {
    return 1;
  }

  const url = new URL(links.next);
  return parseInt(uri.searchParams.get('page[offset]')) / meta.total;
}

相关问题