我尝试创建用户类,并希望能够从类型别名继承:
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
流量可以吗?
答案 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;
}
}
答案 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;
}