Typescript 具有扩展同一父类的不同类的项的大小未知的数组

Typescript 具有扩展同一父类的不同类的项的大小未知的数组,typescript,Typescript,基本上,我们希望声明一个数组,其中包含任意数量的项,这些项的类型是同一基类的子类。我不知道有多少子类(一些可以由第三方插件提供)。如果我像array那样声明数组,我希望对每个文本项对象声明进行精确的类型检查,但typescript迫使我强制转换以进行类型检查。由于类多态性,我或我的用户也不希望强制转换 例如: class Base { name: string } class Sub1 extends Base { prop1: number } class Sub2 extends B

基本上,我们希望声明一个数组,其中包含任意数量的项,这些项的类型是同一基类的子类。我不知道有多少子类(一些可以由第三方插件提供)。如果我像
array
那样声明数组,我希望对每个文本项对象声明进行精确的类型检查,但typescript迫使我强制转换以进行类型检查。由于类多态性,我或我的用户也不希望强制转换

例如:

class Base {
  name: string
}
class Sub1 extends Base {
  prop1: number
}
class Sub2 extends Base {
  prop2:string
}
// there will be other Base subclasses - I don't know how much - some provided by third party plugins

// public function called by end users - I want exact type checking of items object literals and I don't expect to manually cast each of them as in the example: 

function f(arr: Base[]){
}

// This doesn't work: for some reason typescript assumes every item is of type Sub1 even if I explicitly declared the second item as Sub2 : 
f([
  {name: '1', prop1: 1} as Sub1, 
  {name: '1', prop2: '2'} as Sub2, 
])

// This does does work and do exact typechecking as I want but I still need to cast (and I don't think I should)

f([
  {name: '1', prop1: 1},
  {name: '1', prop2: '2'},
] as [Sub1, Sub2])
在类似的情况下,typescript可以完成完美的工作。这是在调用重载方法或函数时发生的。我不需要强制转换,typescript能够精确匹配签名,而不必强制转换任何内容。我想知道对于数组,他们是否不想实现“此自动项推断”),因为性能(可能会有大量(json)数组)

用户调用
f()
的唯一优雅方法是强制转换每个数组项。我不希望我的图书馆的用户被迫这么做。不硬也不明显

有没有一种方法可以让用户调用f()而不必强制转换并进行精确的类型检查?在面向对象语言中,由于类多态性,由于Sub1和Sub2是Base的实例,我(和我的用户)不希望在这里强制转换

注意:因为我不知道所有的基本子类(有些可以由第三方提供),所以我无法使用类型union(
arr:Array
)定义f参数


在其他语言(如Java)中,您可以这样声明数组:
array您得到的错误是一个专门用来捕获打字错误的错误。它触发的最常见原因是属性拼写错误。此检查仅适用于对象初始化

如果您有一个现有数组,只要它有
名称
属性,函数就会乐意接受它

var arr = [
    { name: '1', prop1: 1 },
    { name: '1', prop2: '2' }
];

f(arr);
更多的东西 如果您要处理更多创建项的情况,您可以告诉编译器需要更多的东西:

class Base {
    name: string;
    [key: string]: any;
}
这对编译器来说是透明的

肯定会有一个名字。。。而且可能还有其他一些属性

交叉口类型 如果你不想破坏你的
Base
类,你可以通过使用
Base
和一个单独的
index
类型创建一个交叉点类型来使用以下技巧

class Base {
    name: string;
}

type Indexed = { [key: string]: any; }

// ...

function f(...arr: (Base & Indexed)[]) {
}

// ...
给它起个名字 最后一个整理是给交叉点类型命名。如果你打算在多个地方使用它,这有助于整理一些东西

// ...

type SubOfBase = Base & Indexed;

function f(...arr: SubOfBase[]) {
}

你好,芬顿,谢谢你花时间解释这件事。我并没有试图解决一个错误,我只是试图对数组文本进行严格的类型检查,其中包含任意数量的项,这些项属于基类的不同子类。我找到了一个更好的方法来进行精确的类型检查,但我仍然需要强制转换。由于所有数组项都属于同一个基类的子类,所以我不希望强制转换具有精确的类型检查。我希望typescript能够推断出每个数组成员的确切类型。这可能是因为性能原因而不受支持,但目前在方法重载调用中得到了很好的支持