TypeScript:无法将空数组分配给我自己类型的数组

TypeScript:无法将空数组分配给我自己类型的数组,typescript,types,Typescript,Types,我有一个名为Converter export interface Converter<T> { uuid: CUUID; decode: (value: Buffer) => Promise<T>; encode?: (value: T) => Promise<Buffer>; } 导出接口转换器{ uuid:CUUID; 解码:(值:缓冲)=>承诺; 编码?:(值:T)=>承诺; } 我在另一个文件中使用了一个数组: import

我有一个名为
Converter

export interface Converter<T> {
  uuid: CUUID;
  decode: (value: Buffer) => Promise<T>;
  encode?: (value: T) => Promise<Buffer>;
}
导出接口转换器{
uuid:CUUID;
解码:(值:缓冲)=>承诺;
编码?:(值:T)=>承诺;
}
我在另一个文件中使用了一个数组:

import{ Converter } from "./characteristic";

export type Converters = Converter<any>[];

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

  constructor(converters: C = []) {
           // ^^^^^^^^^^^^^^^^^^ error
    this.converters = converters;
  }
}
从“/characteristic”导入{Converter};
导出类型转换器=转换器[];
导出默认类服务{
专用转换器:C;
构造函数(转换器:C=[]){
//^^^^^^^^^^^^^^^^^^错误
这个。转换器=转换器;
}
}
当我想将空数组作为初始值分配给该属性时,我遇到了一个错误:

类型“never[]”不可分配给类型“C”。
“never[]”可分配给“C”类型的约束,但“C”可以用约束“Converter[]”的不同子类型实例化。ts(2322)
我试着把我的类型改成

export type Converters = Converter<any>[] | [];
导出类型转换器=转换器[]|[]; 不走运

我可以这样做:

导出默认类服务{
专用转换器:C |[]=[];
}

但我不确定为什么我必须这么做,或者这是否是一个合适的解决方案,而不仅仅是一个反模式的解决方案。我甚至不明白这里的问题是什么。

以下方法似乎有效:

export interface Converter<T = any> {
  uuid: CUUID;
  decode: (value: Buffer) => Promise<T>;
  encode?: (value: T) => Promise<Buffer>;
}

export default class Service<C extends Converter> {
  private converters: C[];

  constructor(converters: C[] = []) {
    this.converters = converters;
  }
}

我一下子就不明白为什么它不起作用。但是知道您使用的是哪个版本的TypeScript可能会有所帮助?嘿@fredrik我使用的是TypeScript
3.5.3
,它不起作用,因为您可以为
C
指定更具体的类型,例如
[Converter]
(一个元组类型),并且您不能将值
[]
分配给一个元组。嘿,William。谢谢,但这对我不起作用。转换器可以有多种类型。“这对我不起作用”。。。等等,为什么这里给出的第一个解决方案不适合您使用
类服务{converters:C[];构造函数(converters:C[]=[]){…}
之类的类型<代码>C可以是一个联合体。如果它真的不起作用,我想我们需要一个例子来说明原因。对不起,我假设第一个解决方案将在相同转换器类型的阵列上起作用,我现在看到它不是。我一直在研究我的“东西”,并提出了另一个更复杂的问题,我正在解决这个问题。我将用这个问题来结束这个问题:很抱歉你已经为此付出了努力,但另一个问题可能更确切地说是我正在尝试做的
export default class Service<C extends Converters> {
  private converters: C | [] = [];
}
export interface Converter<T = any> {
  uuid: CUUID;
  decode: (value: Buffer) => Promise<T>;
  encode?: (value: T) => Promise<Buffer>;
}

export default class Service<C extends Converter> {
  private converters: C[];

  constructor(converters: C[] = []) {
    this.converters = converters;
  }
}
export interface Converter<T> {
  uuid: CUUID;
  decode: (value: Buffer) => Promise<T>;
  encode?: (value: T) => Promise<Buffer>;
}

export default class Service<T> {
  private converters: Converter<T>[];

  constructor(converters: Converter<T>[] = []) {
    this.converters = converters;
  }
}