Type checkers¶
Use Pyright for the best type inference with Signified. Pyrefly is a usable alternative with caveats.
Assessed on 2026-10-10 with Python 3.14.3 and Signified 0.7.0 (revision 9de4e8b). The inference suite checks 765 inferred types and 60 operations that should be rejected.
| Checker | Version | Wrong types (of 765) | Invalid operations flagged (of 60) | Recommendation |
|---|---|---|---|---|
| Pyright | 1.1.414 | 0 | 60 | Recommended |
| Pyrefly | 1.3.2 | 33 | 42 | Usable with caveats |
| ty | 0.0.86 | 247 | 56 | Not recommended yet |
| mypy | 2.4.0 | 165 | 34 | Not recommended |
- Pyrefly:
abs,math.trunc,math.floor, andmath.ceilon signals inferUnknown, anddivmodinfers the wrong type for mixed,Decimal, or reflected operands. It acceptsroundand themathfunctions on unsupported values, and reports an error when calling a wrapped callable object. - ty:
unrefandBindingrarely infer the right type, many operators inferUnknown, and some valid operations are rejected, such asSignal(10.0) // Signal(2.0). - mypy:
unrefandBindingreject valid arguments and inferNever. Operators on signals mostly infer correctly. Mypy ran with--check-untyped-defsso test bodies were checked.
Even with Pyright, attributes read through a signal, such as
Signal(person).name, and deep_unref results are typed Any, so a misspelled
attribute is not caught. Functions decorated with @computed or @effect keep
their return type but do not check their arguments.