[fabric/core] rename isVariant to Variant.is

This commit is contained in:
Pablo Baleztena 2024-10-04 11:54:35 -03:00
parent 9092b032b3
commit 290544dc9a
4 changed files with 53 additions and 51 deletions

View File

@ -1,40 +0,0 @@
import { describe, expect, expectTypeOf, it } from "vitest";
import { isVariant } from "./is-variant.js";
import { TaggedVariant, VariantTag } from "./variant.js";
interface SuccessVariant extends TaggedVariant<"success"> {
[VariantTag]: "success";
data: string;
}
interface ErrorVariant extends TaggedVariant<"error"> {
[VariantTag]: "error";
message: string;
}
describe("isVariant", () => {
const successVariant = {
[VariantTag]: "success",
data: "Operation successful",
} as SuccessVariant | ErrorVariant;
const errorVariant = {
[VariantTag]: "error",
message: "Operation failed",
} as SuccessVariant | ErrorVariant;
it("should return true for a matching tag and correctly infer it", () => {
if (isVariant(successVariant, "success")) {
expectTypeOf(successVariant).toEqualTypeOf<SuccessVariant>();
}
if (isVariant(errorVariant, "error")) {
expectTypeOf(errorVariant).toEqualTypeOf<ErrorVariant>();
}
});
it("should return false for a non-matching tag", () => {
expect(isVariant(successVariant, "error")).toBe(false);
expect(isVariant(errorVariant, "success")).toBe(false);
});
});

View File

@ -1,11 +0,0 @@
import { TaggedVariant, VariantTag } from "./variant.js";
export function isVariant<
TVariant extends TaggedVariant<string>,
TTag extends TVariant[VariantTag],
>(
variant: TVariant,
tag: TTag,
): variant is Extract<TVariant, { [VariantTag]: TTag }> {
return variant[VariantTag] === tag;
}

View File

@ -0,0 +1,41 @@
import { describe, expect, expectTypeOf, it } from "vitest";
import { TaggedVariant, Variant, VariantTag } from "./variant.js";
interface SuccessVariant extends TaggedVariant<"success"> {
[VariantTag]: "success";
data: string;
}
interface ErrorVariant extends TaggedVariant<"error"> {
[VariantTag]: "error";
message: string;
}
describe("Variant", () => {
describe("isVariant", () => {
const successVariant = {
[VariantTag]: "success",
data: "Operation successful",
} as SuccessVariant | ErrorVariant;
const errorVariant = {
[VariantTag]: "error",
message: "Operation failed",
} as SuccessVariant | ErrorVariant;
it("should return true for a matching tag and correctly infer it", () => {
if (Variant.is(successVariant, "success")) {
expectTypeOf(successVariant).toEqualTypeOf<SuccessVariant>();
}
if (Variant.is(errorVariant, "error")) {
expectTypeOf(errorVariant).toEqualTypeOf<ErrorVariant>();
}
});
it("should return false for a non-matching tag", () => {
expect(Variant.is(successVariant, "error")).toBe(false);
expect(Variant.is(errorVariant, "success")).toBe(false);
});
});
});

View File

@ -9,3 +9,15 @@ export type VariantFromTag<
TVariant extends TaggedVariant<string>, TVariant extends TaggedVariant<string>,
TTag extends TVariant[typeof VariantTag], TTag extends TVariant[typeof VariantTag],
> = Extract<TVariant, { [VariantTag]: TTag }>; > = Extract<TVariant, { [VariantTag]: TTag }>;
export namespace Variant {
export function is<
TVariant extends TaggedVariant<string>,
TTag extends TVariant[VariantTag],
>(
variant: TVariant,
tag: TTag,
): variant is Extract<TVariant, { [VariantTag]: TTag }> {
return variant[VariantTag] === tag;
}
}