打字稿泛型转换错误

时间:2018-07-09 15:53:15

标签: typescript mobx typescript-generics

我有一个实用程序功能,可以帮助在检查组件中键入检查注入的存储

import { Diff } from 'typelevel-ts';
import * as React from 'react';

export type TypedInject<Stores> = <StoreKeyToInject extends keyof 
 Stores>(
 ...storeKeysToInject: StoreKeyToInject[]
 ) => <ExpectedProps extends Pick<Stores, StoreKeyToInject>>(
  component: React.ComponentType<ExpectedProps>
 ) => React.ComponentType<Diff<ExpectedProps, Pick<Stores, 
  StoreKeyToInject>>>;

我收到错误消息“类型'Pick'不满足约束'keyof ExpectedProps'。   类型'Pick'不能分配给类型'StoreKeyToInject'。”

能否请您解释一下它的作用以及如何解决?

1 个答案:

答案 0 :(得分:1)

虽然您没有提供使用示例,但据我对代码的了解,您想返回一个新组件,该组件将没有在storeKeysToInject中传递的存储。

Pick从类型中选择属性,因此Pick<Stores, StoreKeyToInject>是仅包含传递到storeKeysToInject的商店的对象。

Diff从类型中删除键,因此第二个参数必须是要删除的键。因此得出的结论是,您实际上并不需要Pick,只需要从StoreKeyToInject中删除ExpectedPropsStoreKeyToInject已经是Stores的密钥,因此无需再次将Stores带入讨论)

export type TypedInject<Stores> = 
    <StoreKeyToInject extends keyof Stores>(...storeKeysToInject: StoreKeyToInject[]) 
        => <ExpectedProps extends Pick<Stores, StoreKeyToInject>> (component: React.ComponentType<ExpectedProps>) 
            => React.ComponentType<Diff<ExpectedProps, StoreKeyToInject>>;