首页 > 解决方案 > 导出类的构造函数的参数已经或正在使用私有名称''(空字符串)ts(4063)

问题描述

我正在尝试在 TypeScript 中实现一个类,我可以选择将converters构造函数中的变量 ( ) 传递给,这将定义在该类中定义的 a 的类型Generic

在下面的文件中,您可以看到我正在从另一个类导入和导出一个类型,我正在Record从该类型创建一个名为Converters,我正在创建类型Names,并且Value根据泛型是否传递给它来定义类型(传递给实现中的类)并且是Converters.

因此,无论该类是否Service接收converters作为参数,Names<C>并且Value<C, N>将返回不同的类型。

/**
 * importing and exporting some types
 **/

import { Converter } from "./characteristic";
export { Converter } from "./characteristic";

/**
 * defining some types myself
 **/

export type Converters = Record<string, Converter<any>>;

export type Names<C> = C extends Converters ? keyof C : (string | number);

export type Value<C, N extends Names<C>> = C extends Converters
  ? ConvertersValue<C, N>
  : Buffer;

export type ConvertersValue<
  C extends Converters,
  N extends Names<C>
> = C[N] extends Converter<infer V> ? V : never;

/**
 * implementation
 **/

export default class Service<C> {
  private converters?: Converters;

  constructor(converters?: C extends Converters) {
  //                                 ^^^^^^^^^^
  //                                 an error occurs here
    this.converters = converters;
  }

  public async read<N extends Names<C>>(name: N): Promise<Value<C, N>> {
    throw new Error("Not implemented yet");
  }
}

这很好用。但是我想要TypeGuard可以传递给构造函数的参数,这样我就可以确保用户不能传递任何东西 ( undefined) 给它,但是如果传递一些东西给它,它必须是 type Converters。所以我写了

constructor(converters?: C extends Converters) {}

但这会抛出一个打字稿

type Converters = {
    [x: string]: Converter<any>;
}
Parameter 'converters' of constructor from exported class has or is using private name ''.ts(4063)
Parameter 'converters' of constructor from exported class has or is using private name ''.ts(4063)

我正在导出我正在使用的所有类型,TypeScript 提示我缺少一个空字符串,所以我不确定出了什么问题。

编辑,奇怪的是,当我将它用作构造函数时也会发生这种情况

  constructor(converters: C extends string) {
    this.converters = converters;
  }

标签: typescript

解决方案


对于其他发现此问题的人,请在函数签名中使用它之前声明泛型,例如。

constructor<C extends string>(converters?:C) { .... }

不是

constructor(converters?:C extends string) { .... }

我在接口声明中使用它:

interface Foo {
    myMethod<T extends MyAbstractClass>(obj:T):void;
}

推荐阅读