如何在打字稿中实施类型区分?

时间:2018-09-06 18:49:30

标签: typescript

在打字稿中,如果您有两个接口并且作为联合类型,为什么不区分可以声明的类型成员?

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),
          ),
        ));
  }
}

1 个答案:

答案 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