typescript - 通用和映射类型缩小

标签 typescript typescript2.0

type ModalProps = {
  login: LoginModalProps;
  signup: SignupModalProps;
};

interface ModalRootProps<K extends keyof ModalProps> {
  modalType: K;
  modalProps: ModalProps[K];
}

export function ModalRoot<ModalType extends keyof ModalProps>(props: ModalRootProps<ModalType>) {
  switch (props.modalType) {
    case 'login': {
      return <LoginModal {...props.modalProps}/>;
    }

    case 'signup': {
      return <SignupModal {...props.modalProps} />;
    }

    default:
      return null;
  }
}

这段代码的结果是

TypeError on props.modalProps (LoginFormProps is not assignable to SignupFormProps).

switch 语句中 ModalType 缩小为 'login' 时,我希望 modalProps 为输入为 ModalProps['switch'] (SignupFormProps),但仍输入为 ModalProps[K]

我在这里做错了什么?

最佳答案

像这样的类型保护通常与受歧视的联合一起使用。您可以使用 ModalProps 创建这样的类型,然后类型保护将按预期工作。

type ModalRootProps<T extends keyof ModalProps> =  T extends keyof ModalProps ? { modalProps: ModalProps[T], modalType: T}: never 

export function ModalRoot(props: ModalRootProps<keyof ModalProps>) {
    switch (props.modalType) {
        case 'login': {
            return <LoginModal { ...props.modalProps } />;
        }
        case 'signup': {
            return <SignupModal { ...props.modalProps } />;
        }

        default:
            return null;
    }
}

不知道为什么你的原始代码不起作用,类型防护通常非常注重缩小类型。

关于typescript - 通用和映射类型缩小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50410198/

相关文章:

asp.net-mvc - VS2015 没有 TypeScript 模板,不支持 TypeScript

javascript - 如何基于接口(interface)TypeScript创建对象?

node.js - 使Typescript 2路径映射(别名)正常工作

javascript - 如何在单击按钮后从表单中获取结果(JavaScript 和 HTML)

javascript - 为什么我的 react 表没有更新数据?

JavaScript 从实数和整数计算哈希码

reactjs - 如何使用 TypeScript 和 React-Router 4、5 或 6 重写 protected /私有(private)路由?

angular - typescript :使用类作为接口(interface)

javascript - 使用外部 JS 库 Angular 2

多个字段的 Angular 4 表单验证