Dart 相当于 TypeScript 中的匿名类型对象

Moh*_*han 3 dart typescript flutter

在 TypeScript 中,我可以简单地定义一个匿名对象,如下所示,并且仍然可以获得它的智能感知。

let person = {
  age: 10,
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法在 dart lang 中做同样的事情。

但我可以使用类和静态属性做类似的事情。

class Person {
  static age = 10;
}
Run Code Online (Sandbox Code Playgroud)

这样就完成了工作,但我想知道是否有更简单的方法。

Ale*_*ntt 8

Dart >= v3.0.0 的答案

Dart 3 引入了Records,它允许你做你想做的事:

final person = (
  name: 'Foo',
  username: '@bar',
  age: 45,
  greet: () => 'Hello, Foo',
  greetIAm: (String iam) => 'Hello, Foo! I am $iam',
);

void main() {
  // Foo
  print(person.name);

  // @bar
  print(person.username);

  // 45
  print(person.age);

  // Hello Foo!
  print(person.greet());

  // Hello Foo! I am Bar!
  print(person.greetIAm('Bar!'));
}
Run Code Online (Sandbox Code Playgroud)

您还可以定义类型来声明所需的字段,而无需声明新类:

typedef Person = ({
  String name,
  int age,
});

// With positional values instead:
typedef PersonButWithUnnamedParams = (
  String name,
  int age,
);

Person createPerson(String name, int age) {
  return (
    name: name,
    age: age,
  );
}

// Create a var direct from the type definitio.
final Person stranger = (
  age: -1,
  name: 'Stranger',
);

// Create a var of type Person through a function.
final Person stranger2 = createPerson('Stranger', -1);

// Positional params are also supported.
final PersonButWithUnnamedParams stranger3 = (
  'Stranger',
  -1,
);
Run Code Online (Sandbox Code Playgroud)

限制:

  • 您不能递归地引用 typedef,您需要声明一个类。

Dart < v3.0.0 的答案

你不能。

Dart 不支持匿名类型。

您可以定义一个Map

final person = <String, int>{'age': 10};
Run Code Online (Sandbox Code Playgroud)

但从智能感知的角度来看,它只是Map包含 type 的键String和 type 的值int,无法推断出存在agevalue 的键10

因此,如果你想要智能感知,你应该将其定义为一个类:

class Person {
  const Person(this.age);

  final int age;
}

const person = Person(10);

print(person.age); // 10
Run Code Online (Sandbox Code Playgroud)

  • 这与强类型无关。Dart 根本不支持*匿名*类型。例如,编译器可以自动创建一个新类型,然后它将具有强类型的通常好处(例如,无法将其分配给不同类型的变量)。 (3认同)