为什么TypeScript不报告此键入错误?

为什么TypeScript不报告此键入错误?,typescript,types,Typescript,Types,我有以下代码: authUserListener=(下一步:(newUser:AuthUser)=>void,回退:()=>void):取消订阅=>{ 返回此.auth.onAuthStateChanged((用户:firebase.user | null)=>{ console.log(用户); 如果(用户){ this.user(user.uid).on(“value”,(快照:firebase.database.DataSnapshot)=>{ const databaseUser=sna

我有以下代码:

authUserListener=(下一步:(newUser:AuthUser)=>void,回退:()=>void):取消订阅=>{
返回此.auth.onAuthStateChanged((用户:firebase.user | null)=>{
console.log(用户);
如果(用户){
this.user(user.uid).on(“value”,(快照:firebase.database.DataSnapshot)=>{
const databaseUser=snapshot.val();
//合并身份验证和数据库用户
const mergedUser:UserData={
uid:user.uid,
电子邮件:user.email,
…数据库用户,
};
下一步(mergedUser);
},
);
}否则{
后退();
}
});
};
此类方法的调用方式如下:

const unsubscribeFromListener=firebase.authUserListener(
(newUser:UserData)=>{
const different=newUser==user;
if(不同的| |用户===null){
setUser(newUser);
}
},
() => {
如果(用户!==null){
setUser(空);
}
},
);
代码工作得非常好!但是,我注意到我正在将一个类型为
UserData
的变量传递给一个类型为
AuthUser
的函数。这些类型被定义为:

type UserData={
uid:字符串;
电子邮件:字符串;
用户名:字符串;
};
键入AuthUser=“uninitialized”| null | UserData;

authUserListener
方法中,我调用作为参数传递的
next
函数,变量类型为
UserData
,而我说
authUserListener
接收类型为
(newUser:AuthUser)=>void
的函数
next
,因此它的参数为type
AuthUser
。正如您在上面看到的,这两种类型是不同的。为什么TypeScript没有警告我将错误的类型传递给
下一个
函数?

UserData
AuthUser
的有效类型。您已将其创建为
null
未初始化“
UserData
,因此任何类型为
UserData
的参数都是
AuthUser
类型的有效实例化

如果去掉其他字符,您的语句是
typeauthuser=UserData
(或者它可以是字符串文字“uninitialized”,或者它可以是
null

如果你说它可能是
“3”|“5”|“6”
,然后你传入“6”,你会认为它是有效的,对吗?同样,您已经为创建的类型传入了一个有效实例


这说明问题了吗?

您是否可以提供中所述的自包含的,这样我就可以将其放入web IDE中,并为自己演示这个问题?乍一看,似乎一切都很好。。。类型为
(arg:a | B | C)=>void
的函数表示“我接受
a
B
C
参数”,因此它很乐意使用类型为
a
的参数调用。您应该始终能够为接受超类型的人提供类型值。