Расширения типа классные, и, надеюсь, они позволят быть кросс-файлом, , оставаясь при этом внутренними . Если вы делаете расширение типа в том же файле, оно компилируется в один класс, и расширение имеет доступ к закрытым членам и так далее. Если вы делаете это в другом файле, это просто «необязательное» расширение, такое как методы статического расширения C #. (Хотя спецификации F # говорят по-другому.)
Я был бы удивлен, если бы это не решалось в какой-то момент, если только для поддержки дизайнера. Если бы внутренние расширения типов могли быть где-нибудь в сборке, это было бы довольно гладко.
Другой вариант, который может быть не тем, что вам нужно, это создать тип и модуль, назвать модуль с тем же именем, а затем добавить к нему флаг ModuleSuffix:
type Foo() =
static member Bar = 1
[<CompilationRepresentationAttribute(CompilationRepresentationFlags.ModuleSuffix)>]
module Foo =
let Baz = 2
printfn "%d %d" Foo.Bar Foo.Baz
Это используется в библиотеках F #, поэтому они могут иметь список типов или что угодно, вместе с тоннами вспомогательных элементов в модуле.