【问题标题】:Typescript generics: infer type from second parameter to use in the first打字稿泛型:从第二个参数推断类型以在第一个参数中使用
【发布时间】:2021-11-11 21:03:20
【问题描述】:

我有这样的代码:

export type Subscribe<T extends object> = <U>(
  listener: (slice: U) => void,
  selector: (state: T) => U,
) => void

// implementation doesn't matter
const subscribe = {} as Subscribe<{ value: number }>

subscribe(
  (value) => value * 2, // ts error: object is of type unknown
  (state) => state.value
)

似乎不可能用 typescript 以这种方式推断类型

但如果我改变参数的顺序,它就可以正常工作:

export type Subscribe<T extends object> = <U>(
  selector: (state: T) => U,
  listener: (slice: U) => void,
) => void

const subscribe = {} as Subscribe<{ value: number }>

subscribe(
  (state) => state.value,
  (value) => value * 2 // now no error! number type is inferred
)

我希望selector 成为第二个参数以使其成为可选,请告诉我这是不可能的或者你是否知道方法

【问题讨论】:

    标签: typescript generics type-inference


    【解决方案1】:

    考虑这个例子:

    const subscribe = <
        T extends Record<PropertyKey, unknown>,
        ReturnValue,
        >(
            listener: (slice: ReturnValue) => void,
            selector: (state: T) => ReturnValue,
    ) => {}
    
    subscribe(
        (value) => value * 2,
        (state: { value: number }) => state.value
    )
    

    Playgroud

    我不确定您是否需要单独的类型。您可以从函数级别推断所有泛型

    【讨论】:

    • 谢谢,但我希望在 subscribe 调用中推断类型,您在其中添加了 { value: number },所以我只是像第二个示例中那样更改参数顺序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2011-10-11
    • 2019-11-25
    • 2020-06-08
    • 2020-03-01
    • 1970-01-01
    相关资源
    最近更新 更多