gpt4 book ai didi

typescript - 抽象掉 typescript 中的泛型类型参数

转载 作者:行者123 更新时间:2023-12-03 16:49:45 25 4
gpt4 key购买 nike

我遇到了似乎无法避免的情况 any在 typescript 中。这是一个反射(reflect)我正在尝试做的事情的示例:

type NativeFn<A, B> = {
kind: 'native'
fn: (a: A) => B
}

type ComposeFn<A, B, C> = {
kind: 'compose'
f: Fn<B, C>
g: Fn<A, B>
}

type Fn<A, B> = NativeFn<A, B>
| ComposeFn<A, any, B> // <=== HERE

function evalfn<A, B>(fn: Fn<A, B>, arg: A): B {
switch (fn.kind) {
case 'native': return fn.fn(arg)
case 'compose': {
// intermediate has type "any", which is a drag.
const intermediate = evalfn(fn.g, arg)
return evalfn(fn.f, intermediate)
}
}
}

我想说的是 ComposeFn<A, B, C>始终是 Fn<A, C> ,无论哪种类型 B是,但是 B还是应该打字。

any ,我可能会错误地输入以下内容:

const F: Fn<string, string[]> = { kind: 'native', fn: (n) => [n] }

const G: Fn<number, number> = { kind: 'native', fn: (n) => n + 1 }

const FoG: Fn<number, string[]> = {
kind: 'compose',
f: F,
g: G,
}
unknown也不起作用。 Example .

有什么办法可以完成我在这里要做的事情吗?

最佳答案

我会建议简单的事情,因为您有具有不同泛型数量的联合 NativeFn有两个参数和 ComposeFn有三个,那么主要的也应该有三个,为了没有空格,我们可以通过默认值第三个来实现。考虑:

type Fn<A, B, C = B> = NativeFn<A, C>
| ComposeFn<A, B, C>

function evalfn<A, B, C = B>(fn: Fn<A, B, C>, arg: A): C {
switch (fn.kind) {
case 'native': return fn.fn(arg)
case 'compose': {
const intermediate = evalfn(fn.g, arg)
return evalfn(fn.f, intermediate)
}
}
}

我们在这里做了什么:
  • Fn始终具有三个通用参数。默认 C=B
  • evalfn也适用于三个参数泛型类型
  • 我们更改了 evalfn 的返回值至 C

  • 让我们检查它是否正常工作:
    // my utility to make such construct
    const makeNativeF = <A, B>(fn: (a: A) => B): NativeFn<A,B> => ({
    kind: 'native',
    fn
    })
    const nativeF = makeNativeF((a: number) => a);
    const resultNative = evalfn(nativeF, 1); // correct number type result!

    // my utility to make such construct
    const makeComposeF = <A, B, C>(f: Fn<B,C>, g: Fn<A,B>): ComposeFn<A, B, C> => ({
    kind: 'compose',
    f,
    g
    });

    const composeF = makeComposeF(makeNativeF((a: number) => a + ': string'), makeNativeF((a: number) => a));
    const resultComposed = evalfn(composeF, 1); // result is string! correct!

    一切看起来都不错。希望能帮助到你。

    关于typescript - 抽象掉 typescript 中的泛型类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60403068/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com