more precise definition to match typechecker exactly