From 53b0958acddb5359ce6dc2515d006d1c3308333c Mon Sep 17 00:00:00 2001 From: Maxime Mangel Date: Mon, 8 Apr 2024 10:41:06 +0200 Subject: [PATCH] fix: don't wrap type inside of a ResizeArray if the argument is spreaded [converter] Fix #74 --- src/Glutinum.Converter/Transform.fs | 16 +++++++++++++++- .../references/class/constructorsWithSpread.fsx | 2 +- ...eralTypeIntersectionAndMultipleProperties.fsx | 2 +- .../references/functionType/spreadArgument.fsx | 2 +- .../typeLiteral/constructSignature.fsx | 2 +- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/Glutinum.Converter/Transform.fs b/src/Glutinum.Converter/Transform.fs index ec636a4..2bdcab6 100644 --- a/src/Glutinum.Converter/Transform.fs +++ b/src/Glutinum.Converter/Transform.fs @@ -453,6 +453,20 @@ let private transformParameter = let context = context.PushScope(parameter.Name) + let typ = + let computedType = transformType context parameter.Type + + // In TypeScript, if an argument is marked as spread, users is forced to + // use an array. We want to remove the default transformation for that + // array and use the underlying type instead + // By default, an array is transformed to ResizeArray in F# + if parameter.IsSpread then + match computedType with + | FSharpType.ResizeArray underlyingType -> underlyingType + | _ -> computedType + else + computedType + { Attributes = [ @@ -461,7 +475,7 @@ let private transformParameter ] Name = Naming.sanitizeName parameter.Name IsOptional = parameter.IsOptional - Type = transformType context parameter.Type + Type = typ } let private transformAccessor (accessor: GlueAccessor) : FSharpAccessor = diff --git a/tests/specs/references/class/constructorsWithSpread.fsx b/tests/specs/references/class/constructorsWithSpread.fsx index d12d1f0..1de512f 100644 --- a/tests/specs/references/class/constructorsWithSpread.fsx +++ b/tests/specs/references/class/constructorsWithSpread.fsx @@ -9,7 +9,7 @@ type Exports = [] static member Logger () : Logger = nativeOnly [] - static member Logger ([] args: ResizeArray []) : Logger = nativeOnly + static member Logger ([] args: string []) : Logger = nativeOnly [] [] diff --git a/tests/specs/references/class/staticMemberWithReturnLiteralTypeIntersectionAndMultipleProperties.fsx b/tests/specs/references/class/staticMemberWithReturnLiteralTypeIntersectionAndMultipleProperties.fsx index 8f21e33..556a826 100644 --- a/tests/specs/references/class/staticMemberWithReturnLiteralTypeIntersectionAndMultipleProperties.fsx +++ b/tests/specs/references/class/staticMemberWithReturnLiteralTypeIntersectionAndMultipleProperties.fsx @@ -27,7 +27,7 @@ Class.mergeOptions($0)""" emitJsExpr (initHookFn) $$""" import { Class } from "module"; Class.addInitHook($0)""" - static member inline addInitHook (methodName: string, [] args: ResizeArray []): obj = + static member inline addInitHook (methodName: string, [] args: obj []): obj = emitJsExpr (methodName, args) $$""" import { Class } from "module"; Class.addInitHook($0, $1)""" diff --git a/tests/specs/references/functionType/spreadArgument.fsx b/tests/specs/references/functionType/spreadArgument.fsx index 5f805e2..fdcf45d 100644 --- a/tests/specs/references/functionType/spreadArgument.fsx +++ b/tests/specs/references/functionType/spreadArgument.fsx @@ -8,7 +8,7 @@ open System [] type Log = [] - abstract member Invoke: prefix: string * [] args: ResizeArray [] -> obj + abstract member Invoke: prefix: string * [] args: obj [] -> obj (***) #r "nuget: Fable.Core" diff --git a/tests/specs/references/typeLiteral/constructSignature.fsx b/tests/specs/references/typeLiteral/constructSignature.fsx index f3733b1..79df0f8 100644 --- a/tests/specs/references/typeLiteral/constructSignature.fsx +++ b/tests/specs/references/typeLiteral/constructSignature.fsx @@ -8,7 +8,7 @@ open System [] type Test = [] - abstract member Create: [] args: ResizeArray [] -> obj + abstract member Create: [] args: obj [] -> obj (***) #r "nuget: Fable.Core"