“可选输入”有什么特别之处?
人们对Dart支持“可选输入”非常热衷,但是一旦语言支持鸭子打字 - 我不能认为可选输入是理所当然的吗?这不是一个明显的特征吗?
答案 0 :(得分:2)
当您指定类型注释时,您将信息传递给其他开发人员和工具。
考虑两个函数的这个(相当长的)示例 - 第一个没有类型信息,第二个类型信息:
createConnection(details) {
var foo = details.host; // assume details has a host property
// do stuff
return connection;
}
与
Connection createConnection(ConnectionParams details) {
var foo = details.host; // tools can validate that details has a host property
// do stuff
return connection;
}
当你调用第一个函数时,你需要知道(从阅读API文档或源代码)该函数采用具有host
字段的东西。您还需要知道该函数返回一个Connection
对象,而不是字符串或其他东西。
当您调用第二个函数时,您知道可以传入符合ConnectionParams
定义的接口的任何对象,并且您知道返回了Connection
个对象。
假设您有两个班级:
class MySqlConn {
String host;
}
class PostgreSqlConn {
String host;
}
// elsewhere
var conn = new MySqlConn()..host = '127.0.0.1';
createConnection(conn);
虽然它是有效的鸭子类型,但是第一个函数和这些类之间的代码没有连接,除了它们都有一个具有相同名称的字段:host
。
看看这两个类,我不能说它们的一个用途是将它们的实例传递给createConnection()
函数(并且工具也很难理解它)。我无法为链接回这两个类的createConnection
函数创建API文档。
当您添加更多类型信息时,传达意图,突然间一切都汇集在一起。
// define an interface
abstract class ConnectionParams {
String host;
}
// inform tools and humans that MySqlConn implements the interface
class MySqlConn implements ConnectionParams {
String host;
}
class PostgreSqlConn implements ConnectionParams {
String host;
}
现在,工具和人类都可以在静态代码中形成从第二个createConnection
函数到类以及最终界面的链接。在第一个示例中,链接仅在运行时生成。