[fabric/core] Add isVariant utility function
This commit is contained in:
parent
80c34e4649
commit
3f91e35790
40
packages/fabric/core/src/variant/is-variant.spec.ts
Normal file
40
packages/fabric/core/src/variant/is-variant.spec.ts
Normal file
@ -0,0 +1,40 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
11
packages/fabric/core/src/variant/is-variant.ts
Normal file
11
packages/fabric/core/src/variant/is-variant.ts
Normal file
@ -0,0 +1,11 @@
|
||||
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;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user