“可选类型”有什么特别之处?
人们非常热衷于 Dart 支持“可选类型”,但是一旦一种语言支持鸭子类型——我就不能认为可选类型是理所当然的吗?不是很明显的特点吗?
“可选类型”有什么特别之处?
人们非常热衷于 Dart 支持“可选类型”,但是一旦一种语言支持鸭子类型——我就不能认为可选类型是理所当然的吗?不是很明显的特点吗?
当您指定类型注释时,您将信息传递给其他开发人员和工具。
考虑这个(相当长的)两个函数的例子——第一个没有类型信息,第二个有类型信息:
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
函数返回到类并最终返回到接口的链接。对于第一个示例,该链接仅在运行时创建。