Spectrum 对模态使用特定模式,我想用 typescript、graphQL 和 graphQL-codegen 生成的钩子来复制这些模式。
现在我目前拥有的:
- GraphQL 客户端架构
enum ModalType {
LOGIN,
SIGNUP,
}
type LoginModalProps{
loginVal: String!
}
type SignupModalProps{
signupVal: String!
}
extend type Query {
openedModal: OpenedModal!
}
union ModalProps = LoginModalProps | SignupModalProps
type OpenedModal {
modalType: ModalType!
modalProps: ModalProps!
}
- GraphQL 查询
export const GET_OPENED_MODAL = gql`
query OpenedModal{
openedModal @client{
modalType,
modalProps{
... on LoginModalProps {
loginVal
}
... on SignupModalProps {
signupVal
}
}
}
}
`;
graphql-codegen 使用上面的代码来生成下面使用的类型安全查询钩子。
import React from 'react';
import LoginModal from '../containers/modals/LoginModal';
import SignupModal from '../containers/modals/SignupModal';
import {
useOpenedModalQuery,
ModalType,
LoginModalProps,
SignupModalProps
} from '../../generated/graphql';
const ModalContainer: React.FC = () => {
const { data } = useOpenedModalQuery();
switch(data?.openedModal.modalType){
case ModalType.Login:
return <LoginModal {...data?.openedModal.modalProps as LoginModalProps}/>
case ModalType.Signup:
return <SignupModal {...data?.openedModal.modalProps as SignupModalProps}/>
default:
return null;
}
}
export default ModalContainer
给定的模态声明如下所示
import { LoginModalProps } from '../../../generated/graphql';
const LoginModal: React.FC<LoginModalProps> = ({
loginVal
}) => {
我是这个 typed 和 graphQL 世界的新手,我觉得它可以做得更好——尤其是我必须使用 switch case 语句而不是原始对象。有什么方法可以保持 ModalType 和 ModalPropsType 之间的耦合吗?并且as
在 ModalProps 上进行强制转换后代码仍然安全吗?