让类继承类型别名

时间:2017-03-15 17:24:39

标签: javascript class inheritance flowtype

我尝试创建用户类,并希望能够从类型别名继承:

StorageFile sf = await DownloadsFolder.CreateFileAsync("testMarker");
StorageFolder dlFolder = await sf.GetParentAsync();

这当然不起作用,但是我希望有以下语义,而不必复制type PlainUser = { email: string } class User extends PlainUser { constructor (initialValues: PlainUser) { this.email = initialValues.email } update () { ... } } (以及我未显示的所有其他字段以保持简短):

email

流量可以吗?

3 个答案:

答案 0 :(得分:0)

我不知道,但您至少可以使用implements来强制User类实现PlainUser接口(是的,您必须将其更改为接口)。

interface PlainUser {
  email: string;
}

class Foo implements PlainUser {
}

tryflow

上面的代码在Flow v0.41中产生以下错误,因为Foo未指定email属性:

7: class Foo implements PlainUser {
                        ^ property `email` of PlainUser. Property not found in
7: class Foo implements PlainUser {
         ^ Foo

当然,这并不是你所要求的。但至少你会自动检查User是否实现PlainUser,而不是一无所获。

答案 1 :(得分:0)

您只能从类扩展,并且您的类型别名是一个接口,因此您必须在此处使用Contains。 TypeScript Salsa允许从this suggestion was implemented开始执行以下操作:

implement

如果您不使用salsa,则必须显式声明继承的属性:

type PlainUser = { email: string };

class User implements PlainUser {
  constructor (initialValues: PlainUser) {
      this.email = initialValues.email;
  }
}

Playground

答案 2 :(得分:0)

我承认这最初是一个令人头疼的问题,但是你想做的事情很有可能。它确实需要重新思考一下这个方法。

首先,您需要以class而不是对象文字开头。直觉上这是有道理的,因为这也是javascript的工作方式。

class User {
  email: string;
}

接下来,您要使用flow的$Shape转换。这会将您的类型转换为类的可枚举属性。

type PlainUser = $Shape<User>;

const Bob: PlainUser = { email: "bob@bob.com" }

const BobProperties: PlainUser = { ...new PlainUserClass("bob@bob.com") }

最后,正常扩展User类。

class AdminUser extends User {
  admin: true;
}

example