У меня есть базовая учетная запись интерфейс:
interface Account {
id: number;
email: string;
password: string;
type: AccountType;
}
, где AccountType :
enum AccountType {
Foo = 'foo',
Bar = 'bar'
}
и два подтипа учетных записей ( FooAccount и BarAccount ), расширяющие интерфейс Account :
interface FooAccount extends Account {
foo: Foo;
}
interface BarAccount extends Account {
bar: Bar;
}
Account - это совокупность, которая содержитОсновная информация об учетной записи и, в зависимости от типа, владеет объектом Foo или Bar .
Действия над этими объектами могут выполнять только их владельцы (учетная запись).
Я определил AccountRepository :
export interface AccountRepository {
findById(accountId: number): Account;
}
где findById(accountId: number)
возвращает учетную запись , но эта учетная запись может быть любой FooAccount или BarAccount .
Я хочу использовать эту findById
перед выполнением каких-либо действий с Foo
или Bar
.Например, допустим, я хочу обновить Foo
:
- будет использовать
findById(accountId: number)
для извлечения учетной записи - проверить AccountType учетной записи, в данном случае
account.type === AccountType.Foo
- , если проверка AccountType верна, то получит доступ к
account.foo.id
и будет использовать fooId
для выполнения требуемого обновления
Проблема здесь в том, что эта последняя точкане удается: findById(accountId: number): Account
возвращает Account , и в его интерфейсе не определено свойство foo: Foo
.
Я также попытался выполнить следующее, но также не может быть выполнено:
const fooAccount: FooAccount = findById(accountId);
потому что функция возвращает Account .
Я пытаюсь выяснить, как этого можно достичь, что я упускаю?Есть ли что-то, что я могу делать неправильно?