No idea about the type properties, but on the question about custom-write, from the docs:
A write-proc method takes three arguments: the structure to be printed, the target port, and an argument that is #t for write mode, #f for display mode, or 0 or 1 indicating the current quoting depth for print mode. The procedure should print the value to the given port using write, display, print, fprintf, write-special, etc.
Also, do note:
Using the prop:custom-write property is discouraged; use the gen:custom-write generic interface instead.
> p
- : point
> (write p)
(1, 2)(1, 2)
> (display p)
(point 1 2)(point 1 2)
As using "struct/props" instead of "struct" would disallow, for example, #:type-name, it wouldn't serve my purpose anyway. Still, I wonder why the doubling of output happens.
A write-proc method takes three arguments: the structure to be printed, the target port, and an argument that is #t for write mode, #f for display mode, or 0 or 1 indicating the current quoting depth for print mode.
So case opt has to handle all four of #f, #t, 0, and 1.
What is described in " Struct type properties for Typed/Racket" seems to be implemented for structs in typed/racket, but not documented, at least it produces identical results.