深入研究这个问题我意识到,我以前的打字compose/pipeline
函数在这种情况下没有帮助。
如果你有一组这样的函数,我想你可以这样输入它们:
type Fn = (arg: any) => any
// credits goes to https://stackoverflow.com/a/50375286
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
k: infer I
) => void
? I
: never;
const pipe =
<T extends Fn, Fns extends T[]>(...fns: [...Fns]) =>
<Data extends Record<string, unknown>>(data: Data) =>
fns.reduce((acc, fn) => fn(acc), data) as Data & UnionToIntersection<ReturnType<Fns[number]>>;
const speakMixin = <T,>(obj: T) => ({
...obj,
speak: () => console.log("I can speak!")
});
const flyMixin = <T,>(obj: T) => ({
...obj,
fly: () => console.log("i'm flying")
});
// const check: {
// age: number;
// } & {
// fly: () => void;
// } & {
// speak: () => void;
// }
const check = pipe(flyMixin, speakMixin)({ age: 42 })
操场 https://www.typescriptlang.org/play?#code/C4TwDgpgBAYgdlAvFAFAQwE4HMBcU1wgCUSAfPoQFCUD0NUAxhhACYCWwAzlFgPYTdgvKAAtgwMJxx1OwNAwDWvAG4QMAMwA2vAO4A6BrwC2NNDQCsABgDMAdnMAmABwA2SqEhQAqnDa84ACq8AJJwwGqcEAzAfnAAPF7kyCheUBAAHuFwLNwEIFAA-KgKeF4kiOTKvGwsUHhwEKoYJBlZOaiUUFAlUGxw6mpQwZTlldUsnYVDk-WNagDc1IZwslBgbJ6Ik3EBaZkQ2dzwADSwK3tt3AEA2gC6pCh6T+oreNdPevCct6OTXXEAETQcguB3aACUorwMCw4rIMH0sKcAK5wBRwXRwUgPFjAtB4IFyX5dElQF6cPTMFjIhgQFDoBgMU4vUZkuAMhhEU64on4biEtBQABk3l8-iCoXCGEi0VicUhwGRGEC4AgcS+1zgyKMACM1PdSItKMtVpxIGgFABZNjpPpIKA7Y4PXg6gBWeACrJQAG9Jh8Xa7jpMzRALXgUKyTbxNBA9NosCgAETBRgEKAhi0AQkTREoAF8iEaTcAyZoQNbbQhkI7nW6PV7fV1-W6g10tCBw5H-Jxo7H40m2AByIylkCInP5wvUWj0YuMERRHq+uik-BYCD1bV6jCLFd54VQZf0UntztkKBVGq7+j7kVH1cZnoR8+XljXqB543dksMBeKe3rJAKDthWfSnI+oFwEQPprhuUAACwOB+uaUEAA
相关问题列表:[键入管道函数 https://stackoverflow.com/questions/65319258/how-to-type-pipe-function-using-variadic-tuple-types-in-typescript-4, 打字管道功能2 https://stackoverflow.com/questions/65057205/typescript-reduce-an-array-of-function/67760188#67760188, 打字撰写功能 https://stackoverflow.com/questions/68800808/can-you-write-a-compose-method-that-infer-types-correctly-if-the-innermost-fun/68801798#68801798, 我的文章 https://catchts.com/FP-style#compose ]