TypeScript:如何在打字上应用地图功能?
TypeScript: How to apply a map function on typings?
目前我有以下几种类型:
type Value = boolean | number | string
class Struct<T extends Value[] = Value[]> {
constructor(fmt: string) { }
pack(...args: T): Buffer { }
}
我想知道如何用下面代码段中传递给构造函数的每个 Struct
使用的 Value[]
列表替换 <???>
:
class StructConcat<T extends Struct[]> {
constructor(...structs: T) { }
pack(...args_list: <???>) { }
}
// example:
const a: HeadStruct = new Struct<[number]>('<I')
const b: VectorStruct = new Struct<[number, number, number]>('<3f')
const concat = new StructConcat(a, b)
最终,StructConcat.pack
函数应该被约束为:
concat.pack([1], [2, 3, 4])
到目前为止,我能做的最好的是:(T[number] extends Struct<infer K> ? K : never)[]
但在上面的场景中,它输出接近的 ([number] | [number, number, number])[]
,但仍然不是:[[number], [number, number, number]]
.
TypeScript 的打字系统允许这样的事情吗?
从 3.1 开始,您可以在映射类型中使用元组:
type Value = boolean | number | string
class Struct<T extends Value[] = Value[]> {
constructor(fmt: string) { }
pack(...args: T): Buffer { }
}
type ExtractValueFromStruct<T> = T extends Struct<infer V> ? V : never
type MapStructTuple<T extends Struct[]> = {
[P in keyof T]: ExtractValueFromStruct<T[P]>
}
class StructConcat<T extends Struct[]> {
constructor(...structs: T) { }
pack(...args_list: MapStructTuple<T>) { }
}
// example:
const a= new Struct<[number]>('<I')
const b= new Struct<[number, number, number]>('<3f')
const concat = new StructConcat(a, b)
concat.pack([1], [1, 2, 3])
concat.pack([1], [1, 2, 3, 4]) // err
目前我有以下几种类型:
type Value = boolean | number | string
class Struct<T extends Value[] = Value[]> {
constructor(fmt: string) { }
pack(...args: T): Buffer { }
}
我想知道如何用下面代码段中传递给构造函数的每个 Struct
使用的 Value[]
列表替换 <???>
:
class StructConcat<T extends Struct[]> {
constructor(...structs: T) { }
pack(...args_list: <???>) { }
}
// example:
const a: HeadStruct = new Struct<[number]>('<I')
const b: VectorStruct = new Struct<[number, number, number]>('<3f')
const concat = new StructConcat(a, b)
最终,StructConcat.pack
函数应该被约束为:
concat.pack([1], [2, 3, 4])
到目前为止,我能做的最好的是:(T[number] extends Struct<infer K> ? K : never)[]
但在上面的场景中,它输出接近的 ([number] | [number, number, number])[]
,但仍然不是:[[number], [number, number, number]]
.
TypeScript 的打字系统允许这样的事情吗?
从 3.1 开始,您可以在映射类型中使用元组:
type Value = boolean | number | string
class Struct<T extends Value[] = Value[]> {
constructor(fmt: string) { }
pack(...args: T): Buffer { }
}
type ExtractValueFromStruct<T> = T extends Struct<infer V> ? V : never
type MapStructTuple<T extends Struct[]> = {
[P in keyof T]: ExtractValueFromStruct<T[P]>
}
class StructConcat<T extends Struct[]> {
constructor(...structs: T) { }
pack(...args_list: MapStructTuple<T>) { }
}
// example:
const a= new Struct<[number]>('<I')
const b= new Struct<[number, number, number]>('<3f')
const concat = new StructConcat(a, b)
concat.pack([1], [1, 2, 3])
concat.pack([1], [1, 2, 3, 4]) // err