Skip to content

js.Value narrowing methods (asString/asNumber/as*Array) fail to compile: undefined expectType/expectTypedArrayOfType #43

Description

@nazarhussain

Summary

In js.Value, every type-narrowing method calls self.expectType(...) (or self.expectTypedArrayOfType(...)), but neither helper is defined anywhere in the package. As a result, referencing any of these methods is a hard compile error.

Observed on zapi 2.2.0 (src/js/value.zig).

Affected methods

All of these reference the missing helpers:

  • asNumber, asString, asBoolean, asBigInt, asFunction, asObject → call self.expectType(...)
  • asInt8Array, asUint8Array, asUint8ClampedArray, asInt16Array, asUint16Array, asInt32Array, asUint32Array, asFloat32Array, asFloat64Array, asBigInt64Array, asBigUint64Array → call self.expectTypedArrayOfType(...)

asArray and asDate are not affected — they use self.val.isArray() / self.val.isDate() directly.

A grep confirms the helpers are referenced but never declared:

$ grep -rnE 'fn expectType\b|fn expectTypedArrayOfType\b' src/
# (no matches)

Compile error

src/js/value.zig:117:17: error: no field or member function named 'expectType' in 'js.value.Value'
        try self.expectType(.string);
                 ^~~~~~~~~~

Minimal reproduction

const js = @import("zapi:zapi").js;

// Referencing any narrowing method triggers the error:
pub fn parse(v: js.Value) !void {
    const s = try v.asString(); // error: no member function named 'expectType'
    _ = s;
}

Expected behavior

The narrowing methods should compile and validate the underlying JS type, returning error.TypeMismatch on a mismatch (as their doc comments state).

Likely fix

Add the missing private helpers to Value, e.g.:

fn expectType(self: Value, expected: napi.value_types.ValueType) !void {
    if ((try self.val.typeof()) != expected) return error.TypeMismatch;
}

fn expectTypedArrayOfType(self: Value, expected: napi.value_types.TypedarrayType) !void {
    if (!(try self.val.isTypedarray())) return error.TypeMismatch;
    const info = try self.val.getTypedarrayInfo();
    if (info.type != expected) return error.TypeMismatch;
}

(Field/method names should be matched to the actual napi API.)

Workaround

Construct the DSL wrapper directly and skip the as* validation, e.g. js.String{ .val = napi_value } instead of value.asString().

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions