joarwilk / flowgen

Generate flowtype definition files from TypeScript
Other
657 stars 87 forks source link

Cannot convert deep-freeze definition file #189

Open pdufour opened 2 years ago

pdufour commented 2 years ago

Hi there, I'm having troubles with deep-freeze library definition file and having a bit of trouble understanding how to fix it myself. Here is the definition file from typescript: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/deep-freeze/index.d.ts

Which gets converted to:

/**
 * Flowtype definitions for df.ts
 * Generated by Flowgen from a Typescript Definition
 * Flowgen v1.20.0
 */

// see https://gist.github.com/thecotne/6e5969f4aaf8f253985ed36b30ac9fe0
type $FlowGen$If<X: boolean, Then, Else = empty> = $Call<
  ((true, Then, Else) => Then) & ((false, Then, Else) => Else),
  X,
  Then,
  Else
>;

type $FlowGen$Assignable<A, B> = $Call<
  ((...r: [B]) => true) & ((...r: [A]) => false),
  A
>;

declare module.exports: typeof deepFreeze;
declare var deepFreeze: typeof npm$namespace$deepFreeze;

declare var npm$namespace$deepFreeze: {|
  <T>(a: T[]): $ReadOnlyArray<deepFreeze$DeepReadonly<T>>,
  <T: Function>(f: T): T,
  <T>(o: T): deepFreeze$DeepReadonly<T>,
|};
declare type deepFreeze$DeepReadonly<T> = $FlowGen$If<
  $FlowGen$Assignable<T, (...args: any) => any>,
  T,
  $ObjMapi<T, <P>(P) => deepFreeze$DeepReadonly<$ElementType<T, P>>>
>;

This seems to work for objects but not for arrays: https://flow.org/try/#0PQKhCgAIUgxAbA9gdwC4E8AOBTSATbAMwEsA7Y1YxUgZ0kMQCd9CA6VGqGAcW1O0YBDVNjyQARujhJkAcz71GiALaRBkACpZsNAMaNimVJAAiRMhSqku0lPNKQAbgEZWAJgAMrD12DhwwMCQNNi4ABaoqJg0AFyBssQ0qKwJqGEAruKsuirAadg5qPzAAGzYAKwAnCWVhAAsgoKEAByEbuUAzJXN5aIdJeIdHoK6tdg+GDiQACQIKLyk0wCShAA8ABoxEoiI8NiCpAA0mmF8xwCi8CGQALyQ2MpG6AB8tzMAwoLw8KtQkAAU-1QjHS2GOGlOR0glxCAEpbq8IXx4QAyAH-QhfELgyEXK7YeE3V4wgmHP7rMmQE5nP4k8DPADc-kmuFmMgW0wAgjQaMRZKRBOI9qtOccAEKvO7TT7fX5UwGsRWMLYAbTFAF1Ca9gaDUejFaxlZAVZzNQj6FjSX9OfSmeACLp4IJGLhlIg8Ok9qxsAAPTBMDhbFmIQj4UKYWAu7AAL2wTIdTpdTmdYewEajsaD2hDkFImGU0wFyh0mBG2GmBDTkdCsbtCeduEcKbzBaLJbLFfD1Zj2C2AG8AD5-VYaZ7-QRbDQqzVbaYAJX2eAA8qR4OhOYwhOhVpX0zXy2Y0wvBHhqGuR89npTICOtrB0qRdJRqGPCJPYZPrxf-oh31td92sbTIemDHqeq7bqOZIDgAvvGBSJrgLKpnuPbAeGYFnpBkozHMyAciscq4eyfBcjyfICkK2Ajsc-wGs6sixGopDoFqzEvNeGjXtMS7iAAVgAsoImDEDRN4AApjuJbEARmB4YYuWGrNMlwPHwqBaDgYmSZetr+P4gSQDktDGOodyyfu-x9jBsIBEEgisHgiSCnsYh3DqcbgMZSRqG8Fk9v8Kp-H2ABETk0C5oghVsmL4jBZKanZagqh46pvKFDCINFkAheIzohXBXnUD54hvIIKXqkyWThZFbmQB5TKGQ5mDpDQYT-AA5JlHWwgyQA

It generates the error:

const a = deepFreeze([
              ^ Cannot call `deepFreeze` because boolean literal `false` [1] is incompatible with boolean literal `true` [2] in the first argument. [invalid-call-util]
References:
29:   $FlowGen$Assignable<T, (...args: any) => any>,
      ^ [1]
9:   ((true, Then, Else) => Then) & ((false, Then, Else) => Else),
       ^ [2]

Compared to the typescript output which works correctly: https://www.typescriptlang.org/play?#code/FAEwpgxgNghgTmABAMwK4DsIBcCWB7dRcMABwDEEwAvMAHgBUA+AChgC5F6BtAXQEoOAJTAwQBKAE8AgnDgwJtYuUo0AdABEwpYaPEKmjANyhIsBCgzZ8hJRS00GiMAA8sYdCADOiMpdwEWZA56AU5jcGh4JDRMfxstZXs6JmY8YNDbFTANBJ0xdEkGI2ATSPN0GABbME8SGAgkTKTEAG9gRA7ELAkSJE1tEXzCpkQAXnbOyfonV3cvRGZVJfgAc08OGHQJPjHGRE2JCcnjxAB+TiOTzo4WxARdAolELgAFRBxCAGswCTxkTh4HH6JDyegYrx4ewAvsYoSUShACJ4sPsxkQEnZqGBmFwJi0AEQgHCeGAAIygYBA+I4yBgUE8YChABpgPxgIj0MjEKS0TAuAAGHjGUmqIkk8mUtFYOCoMCGIA

Any help appreciated.

Thank you!