temporalio/temporal · error

unknown number type: %v

Error message

unknown number type: %v

What it means

Number.GetIntOrDefault converts the wrapped value to int. TypeUnknown and recognized types return values/default, but any other internal numberType value means the Number was constructed with an unregistered type, and the library panics. It is an internal-invariant violation: valid Numbers always carry TypeInt, TypeUint, or TypeUnknown.

Source

Thrown at common/number/number.go:95

		numberType: numberType,
		value:      number,
	}
}

func (n Number) GetIntOrDefault(
	defaultValue int,
) int {
	switch n.numberType {
	case TypeFloat:
		return int(n.value.(float64))
	case TypeInt:
		return n.value.(int)
	case TypeUint:
		return int(n.value.(uint))
	case TypeUnknown:
		return defaultValue
	default:
		panic(fmt.Sprintf("unknown number type: %v", n.numberType))
	}
}

func (n Number) GetUintOrDefault(
	defaultValue uint,
) uint {
	switch n.numberType {
	case TypeFloat:
		return uint(n.value.(float64))
	case TypeInt:
		return uint(n.value.(int))
	case TypeUint:
		return n.value.(uint)
	case TypeUnknown:
		return defaultValue
	default:
		panic(fmt.Sprintf("unknown number type: %v", n.numberType))
	}

View on GitHub (pinned to bde624efd1)

Solutions

  1. Construct Numbers only via the package's exported New* functions
  2. If a new number type was added, add a matching case to GetIntOrDefault's switch
  3. Inspect how the Number was produced (deserialization path) and fix the type registration there

Example fix

// before
default:
	panic(fmt.Sprintf("unknown number type: %v", n.numberType))
// after
case TypeFloat:
	return int(n.value.(float64))
default:
	return defaultValue // log instead of panicking
Defensive patterns

Strategy: type-guard

Validate before calling

func isGetIntSafe(n number.Number) bool { return true } // getter is total for valid Numbers; validate at construction instead

Type guard

func validNumber(n number.Number) bool {
	switch n.NumberType() {
	case number.TypeInt, number.TypeUint, number.TypeUnknown:
		return true
	}
	return false
}

Prevention

When it happens

Trigger: Calling GetIntOrDefault on a Number whose numberType is neither TypeInt, TypeUint, nor TypeUnknown — e.g. a Number built by a constructor or deserializer that set numberType to an unregistered value.

Common situations: Adding a new number type (e.g. float) to the package without updating every getter's switch; hand-constructing Number structs instead of using the provided New* constructors.

Related errors


AI-assisted analysis of temporalio/temporal@bde624efd1 (2026-09-01). Data as JSON: /api/errors/337a1bf9764c55cd. Report an issue: GitHub.