чет пробился несколько часов, так и не смог сделать такое поведение у объекта:
+foo // 1 (1)
foo+'' // 'number' (2)
фишка в том, что если задан valueOf он также вызавается во втором случае и получается '1', а чтобы получить 'number', надо вручную прописывать toString, что не очень элегантно