Я хочу создать класс, который имеет некоторое внутреннее состояние (может быть загрузка, ошибка или успех). Я также хочу, чтобы в классе было несколько методов, которые могли бы проверять состояние этого класса.
Идеальный API:
function f(x: LoadingError<number>) {
if (x.isLoading()) {
} else if (x.isError()) {
} else {
(x.data); // TypeScript knows x.data is of type 'number'
}
}
Главное, с чем я борюсь, - это создание методов isLoading
и isError
, чтобы TypeScript мог их понимать.
Я попытался написать некоторые определенные пользователем типы защиты для фактической структуры класса ("" this is { ... }
"):
class Foo {
public value: string | null;
public hasValue(): this is { value: string } {
return this.value !== null;
}
}
const foo = new Foo();
if (foo.hasValue()) {
// OK
foo.value.toString();
} else {
(foo.value); // TypeScript does NOT understand that this can only be null
}
Однако это не работает, поскольку TypeScript "забывает" о состоянии экземпляра класса в предложении else
.
Одним из моих жестких требований является использование класса для этого, поскольку я не хочу иметь методы isLoading(instance)
или isError(instance)
, а скорее instance.isLoading()
и instance.isError()
.