首页 > 解决方案 > 如何在 TypeScript 中定义特定的数组类型数组?

问题描述

我正在学习 TypeScript 中的高级类型,我想知道是否有可能以某种方式定义这种类型。

想法是有一个类 A 有一个构造函数,该构造函数应该接受一个有限数组或对象数组或任何其他合适的数据类型,这样所有内部数据结构将只接受两个项目,这样第一个项目可以在何时定义调用构造函数,另一个将被修复?如果未定义类型,它应该接受所有原始类型,但第二个仍然是固定的。

例如这样的事情:

interface Inner<T> {
  first: T,
  second: number
}
class A<T> {
  constructor(arrayofxs: Array<Inner<T>>) { 
    // Do something
  }

}

然后像这样使用它。当没有具体设置类型时,第一个参数将接受所有原语或对象

new A([['asd', 1], [123, 2], [{a: 1, b:123}, 3], ...])

然后当它被设置时,它只会接受设置类型作为第一个:

new A<string>([['asd', 1], ['123', 2], ['qwerty', 3], ...])

内部数组不必是特定的数组。

如果我将内部结构定义为

type Inner = Array<T|number>

这不会设置参数的顺序,也不会限制参数的数量。这就是为什么我认为数组不适合作为内部结构,但我可能应该使用 object.

如果我将内部类型定义如下:

type Inner<T> = [T, number]

那会起作用,但是没有指定 T 的实例化会将 T 设置为第一个数组元素的类型。第一种类型实际上也发生了同样的情况。类型 T 似乎设置为第一个元素的类型。

new A([['asd', 1], [123, 2], ... ])

第二个内部数组[123, 2]会显示错误

类型“数字”不可分配给类型“字符串”.ts(2322)

我可以这样使用它

new A<any>([['asd', 1], [123, 2], ...])

但是使用any是一种非常糟糕的做法,我不想使用它。

我怎么可能实现这种打字?

标签: typescriptdata-structurestyping

解决方案


推荐阅读