打字稿错误无法调用可能 'undefined' 的对象
typescript error Cannot invoke an object which is possibly 'undefined'
你好,我是 typescript react 的新手,目前正在尝试使用 typescript 和 youtube 上的教程制作应用程序。
const RegisterCustomer: React.FC = () => {
const [text, setText] = useState<string>('');
const [email, setEmail] = useState<string>('');
const [username, setUsername] = useState<string>('');
const [password, setPassword] = useState<string>('');
const [isSubmitting, setIsSubmitting] = useState(false);
const { register } = useAuth();
return (
<IonPage>
<Register />
<IonContent className="body">
<IonGrid className="gridinput1">
</IonGrid>
<IonGrid className="gridinput2">
<IonRow>
<IonInput type="email" className="inputEmail" value={email} placeholder="Email" onIonChange={e => setEmail(e.detail.value!)}></IonInput>
</IonRow>
</IonGrid>
<IonGrid className="gridinput3">
<IonRow>
<IonInput type="password" className="inputEmail" value={password} placeholder="Password" onIonChange={e => setPassword(e.detail.value!)}></IonInput>
</IonRow>
</IonGrid>
<IonGrid className="gridinput1">
<IonRow>
<IonButton onClick={async e =>{
e.preventDefault()
const res = await register(email, password);
if(res) {
console.log(res);
}
else {
//handle null response
}
console.log(email, password)
}} className="buttonLogin" expand="block" size="default" color="new">
Register Now
</IonButton>
</IonRow>
</IonGrid>
<p className="loginSeller"><a href="https://www.w3schools.com/">Are you a seller? Login as Seller</a></p>
</IonContent>
</IonPage>
);
};
export default RegisterCustomer;
这是 authContext
type ButtonProps = {
children: ReactNode;
}
export const useAuth = () =>useContext(AuthContext);
type AuthContextType = {
currentUser: null;
register: (
email: string,
password: string
) => Promise<UserCredential | undefined>;
};
const AuthContext = createContext<Partial<AuthContextType>>({}); // Partial
export default function AuthContextProvider( { children} : ButtonProps){
const [currentUser, setCurrentUser] = useState(null);
function register(email: string, password:string) {
return createUserWithEmailAndPassword(auth, email, password)
}
const value = {
currentUser,
register,
}
return <AuthContext.Provider value={value}>
{children}
</AuthContext.Provider>
}
我试图将数据从寄存器获取到 firebase,但我在 RegisterCustomer 页面的 register.then 中遇到错误“无法调用可能是 'undefined' 的对象。”我该如何解决这个问题
由于您希望 register
属性 始终存在,请调整您的类型,使其保持为必需 属性:
const AuthContext = createContext<Partial<Omit<AuthContextType, "register">> & Pick<AuthContextType, "register">>({});
在这里,类型被分成两部分。 Partial<Omit<AuthContextType, "register">>
创建一个类型 删除 register
属性 并将其他所有内容标记为可选。 Pick<AuthContextType, "register">
创建的类型 只有 具有 register
属性。我们使用交集 (&
) 将它们组合在一起以获得最终类型,这使得所有内容 除了 register
都是可选的。
这将产生一个额外的错误,因为您将 {}
作为默认值传递,但类型表明 register
属性 必须 出现在该上下文中。由于它只是默认值并且您在使用提供程序时会覆盖它,因此我建议将 no-op 函数作为默认值 register
传递给它。例如:
const AuthContext = createContext<Partial<Omit<AuthContextType, "register">> & Pick<AuthContextType, "register">>({register: async () => undefined});
你好,我是 typescript react 的新手,目前正在尝试使用 typescript 和 youtube 上的教程制作应用程序。
const RegisterCustomer: React.FC = () => {
const [text, setText] = useState<string>('');
const [email, setEmail] = useState<string>('');
const [username, setUsername] = useState<string>('');
const [password, setPassword] = useState<string>('');
const [isSubmitting, setIsSubmitting] = useState(false);
const { register } = useAuth();
return (
<IonPage>
<Register />
<IonContent className="body">
<IonGrid className="gridinput1">
</IonGrid>
<IonGrid className="gridinput2">
<IonRow>
<IonInput type="email" className="inputEmail" value={email} placeholder="Email" onIonChange={e => setEmail(e.detail.value!)}></IonInput>
</IonRow>
</IonGrid>
<IonGrid className="gridinput3">
<IonRow>
<IonInput type="password" className="inputEmail" value={password} placeholder="Password" onIonChange={e => setPassword(e.detail.value!)}></IonInput>
</IonRow>
</IonGrid>
<IonGrid className="gridinput1">
<IonRow>
<IonButton onClick={async e =>{
e.preventDefault()
const res = await register(email, password);
if(res) {
console.log(res);
}
else {
//handle null response
}
console.log(email, password)
}} className="buttonLogin" expand="block" size="default" color="new">
Register Now
</IonButton>
</IonRow>
</IonGrid>
<p className="loginSeller"><a href="https://www.w3schools.com/">Are you a seller? Login as Seller</a></p>
</IonContent>
</IonPage>
);
};
export default RegisterCustomer;
这是 authContext
type ButtonProps = {
children: ReactNode;
}
export const useAuth = () =>useContext(AuthContext);
type AuthContextType = {
currentUser: null;
register: (
email: string,
password: string
) => Promise<UserCredential | undefined>;
};
const AuthContext = createContext<Partial<AuthContextType>>({}); // Partial
export default function AuthContextProvider( { children} : ButtonProps){
const [currentUser, setCurrentUser] = useState(null);
function register(email: string, password:string) {
return createUserWithEmailAndPassword(auth, email, password)
}
const value = {
currentUser,
register,
}
return <AuthContext.Provider value={value}>
{children}
</AuthContext.Provider>
}
我试图将数据从寄存器获取到 firebase,但我在 RegisterCustomer 页面的 register.then 中遇到错误“无法调用可能是 'undefined' 的对象。”我该如何解决这个问题
由于您希望 register
属性 始终存在,请调整您的类型,使其保持为必需 属性:
const AuthContext = createContext<Partial<Omit<AuthContextType, "register">> & Pick<AuthContextType, "register">>({});
在这里,类型被分成两部分。 Partial<Omit<AuthContextType, "register">>
创建一个类型 删除 register
属性 并将其他所有内容标记为可选。 Pick<AuthContextType, "register">
创建的类型 只有 具有 register
属性。我们使用交集 (&
) 将它们组合在一起以获得最终类型,这使得所有内容 除了 register
都是可选的。
这将产生一个额外的错误,因为您将 {}
作为默认值传递,但类型表明 register
属性 必须 出现在该上下文中。由于它只是默认值并且您在使用提供程序时会覆盖它,因此我建议将 no-op 函数作为默认值 register
传递给它。例如:
const AuthContext = createContext<Partial<Omit<AuthContextType, "register">> & Pick<AuthContextType, "register">>({register: async () => undefined});