p
type myStr = "a"|"b" ;type myTaggedUnion= {tag:"A", value:number} | {tag:"B", value:string}Size: a a a
p
type myStr = "a"|"b" ;type myTaggedUnion= {tag:"A", value:number} | {tag:"B", value:string}DO
DO
if(myvar.tag == "A"){} else { throw new UnreachableCaseError(myvar)} там есть тип neverAZ
switch myStr
{
case "a" => ...
}DO
function UnreachableCaseError(obj:never){}DO
AZ
p
switch myStr
{
case "a" => ...
}AZ
p
if(myvar.tag == "A"){} else { throw new UnreachableCaseError(myvar)} там есть тип neverp
p
AZ
AZ
if (Variant.is(foo)) {
let (x,y) = (foo.field1, foo.field2);
}AZ
p
p
DO
enum RestErrorsEnum {
BUSINESS_ERROR1,
INTERNAL,
}
function myHandler(error: RestErrorsEnum) {
switch (error) {
case BUSINESS_ERROR1:
return "Какая-то бизнес-ошибка";
case INTERNAL:
"Внутренняя ошибка";
default:
throw new UnreachableCaseError(error);
}
}
А потом на бэке добавляют еще одну ошибку и у меня код перестаёт собираться. Офигенно жеAZ
export class BadRequestError extends Error {
public static is<T>(obj: NonNullable<T> | BadRequestError): obj is BadRequestError {
return obj instanceof BadRequestError;
}
constructor(message?: string) {
super(message);
}
}
export interface ApiError extends Error {
message: string;
status: number;
response: string;
}
export const ApiError = {
is<T>(obj: NonNullable<T> | ApiError): obj is ApiError {
type hasIsApiException = { isApiException?: boolean };
return (obj as hasIsApiException).isApiException || false;
}
};
Вот у меня такое есть напримерDO