在打字稿中,如果您有两个接口并且作为联合类型,为什么不区分可以声明的类型成员?
class _HomePageState extends State<HomePage> {
FirebaseUser currentUser;
@override
void initState() {
super.initState();
_loadCurrentUser();
}
void _loadCurrentUser() {
FirebaseAuth.instance.currentUser().then((FirebaseUser user) {
setState(() { // call setState to rebuild the view
this.currentUser = user;
});
});
}
String _email() {
if (currentUser != null) {
return currentUser.email;
} else {
return "no current user";
}
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
backgroundColor: Colors.black,
title: Text('userEmail'),
actions: <Widget>[
new FlatButton(
onPressed: _signOut,
child: new Text('logout',
style: new TextStyle(fontSize: 17.0, color: Colors.white))),
],
),
body: new Center(
child: new Text(
_email(),
style: new TextStyle(fontSize: 32.0),
),
));
}
}
答案 0 :(得分:1)
您的接口定义了对象必须具有的成员,但未定义对象可能不具有的成员。结果,IFish
可以使用swim
方法,反之亦然。
看看更新后的示例:
interface IFish {
swim: () => void;
meow: undefined;
}
interface ICat {
meow: () => void;
swim: undefined;
}
type Pet = IFish | ICat;
const pet: Pet = { // compilation error here
meow: () => {
//
},
swim: () => {
//
}
};
这里明确指出,IFish不能定义meow
,而ICat不能定义swim
。但是,这种方法的问题在于,如果您有2个以上的接口和方法,则必须在类型定义中添加很多undefined
。