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
- Construct Numbers only via the package's exported New* functions
- If a new number type was added, add a matching case to GetIntOrDefault's switch
- 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
- Construct Numbers only via the package's New* constructors
- When adding a new number type, update every getter switch (GetInt/GetUint/GetFloatOrDefault) in the same change
- Never build Number struct literals manually
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
- Unknown cluster name: %v with given cluster initial failover
- unsupported deduplication key
- unknown task predicate type: %T
- unknown admin batch type: %T
- version cannot be nil on start
AI-assisted analysis of temporalio/temporal@bde624efd1 (2026-09-01).
Data as JSON: /api/errors/337a1bf9764c55cd.
Report an issue: GitHub.