[fabric/core] rename isVariant to Variant.is
This commit is contained in:
parent
9092b032b3
commit
290544dc9a
@ -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);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@ -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;
|
|
||||||
}
|
|
||||||
41
packages/fabric/core/src/variant/variant.spec.ts
Normal file
41
packages/fabric/core/src/variant/variant.spec.ts
Normal 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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user