从输入项的type参数推断输出数组类型

时间:2020-08-26 00:30:38

标签: typescript typescript-typings

我当前正在为一个函数编写类型,该函数接受ffmpeg -y -i "file.mkv" \ -map 0:1 -c:0 flac -af:0 "pan=3.1| FL < FL + 0.6*BL + 0.6*SL | FR < FR + 0.6*BR + 0.6*SR | FC = FC | LFE = LFE" \ -map 0:3 -c:1 flac -af:1 "pan=2.1| FL < FL + 0.6*BL + 0.6*SL + 0.5*FC | FR < FR + 0.6*BR + 0.6*SR + 0.5*FC | LFE = LFE" \ -map 0:3 -c:2 flac -af:2 "pan=2.1| FL < FL + 0.6*BL + 0.6*SL + 0.5*FC + 0.5*LFE | FR < FR + 0.6*BR + 0.6*SR + 0.5*FC + 0.5*LFE" \ audio.mkv 对象的数组,并返回Only '-af pan=2.1| FL < FL + 0.6*BL + 0.6*SL + 0.5*FC + 0.5*LFE | FR < FR + 0.6*BR + 0.6*SR + 0.5*FC + 0.5*LFE | LFE = FC' read, ignoring remaining -af options: Use ',' to separate filters 的数组。 ffmpeg -y -i "file.mkv" \ -map 0:1 -c:0 flac \ -map 0:3 -c:1 flac \ -map 0:3 -c:2 flac \ -af "pan=3.1| FL < FL + 0.6*BL + 0.6*SL | FR < FR + 0.6*BR + 0.6*SR | FC = FC | LFE = LFE,pan=2.1| FL < FL + 0.6*BL + 0.6*SL + 0.5*FC | FR < FR + 0.6*BR + 0.6*SR + 0.5*FC | LFE = LFE,pan=2.1| FL < FL + 0.6*BL + 0.6*SL + 0.5*FC + 0.5*LFE | FR < FR + 0.6*BR + 0.6*SR + 0.5*FC + 0.5*LFE | LFE = LFE" \ audio.mkv 在所有参数之间并不总是相同。

是否可以将返回类型设置为包含Clazz<U>所有值的数组?

我已经尝试了多种方法,包括UU的各种用法,但是仅仅在键入中这样做似乎并不会产生任何结果。每个U项目的keyof类型的值都可以通过调用typeof来访问。

示例函数:(上下文on GitHub中的实际代码)

U

理想的结果:

Clazz

1 个答案:

答案 0 :(得分:4)

我将对T使用此实现,而我不会将其称为T,因为该名称通常用于通用类型参数。我称之为Tee,代替:

class Tee<U> {
    constructor(public value: U) { }
}

这就是我写example()的方式:

function example<X extends Array<Tee<any>>>(input: X | []) {
    const out = [] as any as { [K in keyof X]: X[K] extends Tee<infer U> ? U : never };

    for (const item of input) {
        out.push(item.value); 
    }

    return out;
}

这里发生了一些事情。一个是example是一个generic函数,其通用类型参数Xconstrained,是一个类似Tee的事物({{1 }}。假设Tee<any>参数的类型为input(我将在下面解释X)。然后,输出类型就是我们断言的X | []

out

mapping the array type { [K in keyof X]: X[K] extends Tee<infer U> ? U : never } 为另一种数组类型,其中我们使用conditional type inferences将每个元素的X展开为Tee<U>。这就是您要查找的类型操作。

实际上,编译器仅通过检查U的实现就不可能发现您正在执行类型操作,这就是为什么我不得不使用type assertion告诉它example()就是这样。

最后要说明的是out类型的| []。这只是一个提示,因此编译器将尝试将为input传入的数组文字解释为tuple类型,而不是无序数组,如{{ 3}},这是GitHub上的一个问题,它要求一种方法来选择元组而不是无序数组。如果没有input,您将倾向于获得无序数组(我想您可以,但不是必须的)。

足够的解释,让我们对其进行测试:

| []

看起来不错!好吧,希望能有所帮助;祝你好运!

this comment