RFCs icon indicating copy to clipboard operation
RFCs copied to clipboard

Expand the `header` flag in the JS Backend to produce a d.ts file.

Open jmgomez opened this issue 1 year ago • 2 comments

Abstract

By leveraging on the existing mechanisms in the compiler, produce a d.ts file when the header flag is used. This file will be a header containing all the definitions exported in the Nim code. Just like the existing header works for the C/C++ backends.

Motivation

No response

Description

The main motivation is to improve the ergonomics of js/ts interop by providing type information that IDEs can use.

Code Examples


type 
  UserProfile*  {.exportc.} = object
    id* : int
    firstName*, lastName*, email*, phone*, country*, pictureUrl* : cstring
    
    proc createDefaultUserProfile*(): UserProfile {.exportc.} =
        UserProfile()

    proc getFullname*(profile: UserProfile): cstring {.exportc.} =    
        formatFullName(profile)
            

Would produce:

export declare type UserProfile = {
	id : number;
	firstName : string;
	lastName : string;
	email : string;
	phone : string;
	country : string;
	pictureUrl : string;
};

export declare function createDefaultUserProfile(): UserProfile;
export declare function getFullName(profile: UserProfile): string;

Backwards Compatibility

No response

jmgomez avatar May 11 '24 17:05 jmgomez

TS has become such a big target that it is worth supporting it somehow for the future of Nim.

juancarlospaco avatar Jun 02 '24 20:06 juancarlospaco

Would love to see this. I've got a large TS project and being able to write nim and have it "just work" without having to manually declare types would be amazing.

evelant avatar Jun 14 '24 19:06 evelant