1

“可选类型”有什么特别之处?

人们非常热衷于 Dart 支持“可选类型”,但是一旦一种语言支持鸭子类型——我就不能认为可选类型是理所当然的吗?不是很明显的特点吗?

4

1 回答 1

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函数返回到类并最终返回到接口的链接。对于第一个示例,该链接仅在运行时创建。

于 2013-07-12T07:52:02.273 回答