SheetXL - v0.8.0-beta.9+sites.210.e2d420901
    Preparing search index...

    Type Alias Feature

    Feature: typeof ICellRange.Feature[keyof typeof ICellRange.Feature]

    The public feature vocabulary — what a cell or range carries, as a queryable dimension.

    This is the agent-facing read vocabulary: getCounts, getRegions and isContentful select by it, and the agent read tools (grep, the regions read) use the same words. It is deliberately distinct from ICell.Content, the transfer vocabulary (clear, copyFrom) — "paste formats" is a coarse transfer bucket, while querying wants the split parts (Fill, Border, NumberFormat…). One enum serving both jobs is how the vocabulary got muddy the first time.

    Members map onto the engine's per-feature spatial indexes. The mapping is internal and not one-to-one: several features may project from one index (NumberFormat/Alignment/Font over the content-style map). Notes joins when the backing is implemented; a feature that silently reports nothing is worse than a missing one.

    String/Number/Boolean are deliberately absent, even though they are real ScalarType values. This vocabulary is for things with a spatial identity — a fill, a formula, an occupied cell — and a scalar kind has none: it is read straight off the value, which is exactly the one pass IRangeStats.getTypedCounts() already makes, richer (it composes with aggregates and frequencies for free, in the same call). getCounts/getRegions/ isContentful were never the right vocabulary for "how many numbers" — range.getStats() is.

    Error stays, for a reason unrelated to the above: it has real spatial identity of its own (the reconciled error view) and partitions like any stored feature — it was never in the same boat as the other three. DateFormat stays too, but as exactly what its name says: a formatting predicate, the same tier as NumberFormat/Alignment/Font, not a value kind — it answers "does this cell carry a date-category number format", nothing about what the value underneath actually is. A caller after "how many cells are genuinely dates" (numeric value AND that format) composes it: DateFormat regions intersected with getStats().getTypedCounts()'s Number — there is deliberately no single feature that already does that intersection, because "is this a date" is a computed fact about a cell's value, read through getInteropType(), not a thing this vocabulary partitions on.