Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Define js-data resource in TypeScript

Is it possible to create a js-data resource definition using a TypeScript class?

What I would like in general is having full typing support on computed property and instance method definitions.

What would be awesome is something like this:

class SomeModel
{
    public someBusinessModelValue = 'foo';
    public someMoreValues = 'bar';

    public get someComputedProperty()
    {
        return this.someBusinessModelValue + someMoreValues;
    }

    public instanceMethod(param: string)
    {
        return this.someMoveValues.search(param);
    }
}

and then

DS.defineResource(fromClass('name', '/endpoint', 'idAttr', SomeModel));

or go even further and define it like

class SomeModelStore extends SomeModel
{
    name = 'name';
    endpoint = 'endpoint';
    idAttribute = 'idAttr';
    relations = 
    {
        //[...]
    }
}

and use it like

DS.defineResource(SomeModelStore);

Note that these are only some thoughts on what I hope it would look like, I am aware that it does probably not work exactly like that.

like image 594
Aides Avatar asked Jun 29 '16 08:06

Aides


1 Answers

JSData 2.x

The answer is yes, somewhat. Creating Resource definitions in JSData 2.x is not very flexible, but you can provide a constructor function (via the useClass option) to be used during record instantiation.

Here is an example: http://plnkr.co/edit/vNCoC8?p=info and the useClass documentation: http://www.js-data.io/docs/dsdefaults#useclass

JSData 3.x

In JSData 3.x you can just extend the various classes:

import { DataStore, Mapper, Record } from 'js-data';

class CustomMapper extends Mapper {
  // ...
}

const store = new DataStore({
  mapperClass: CustomMapper
});

class BaseCustomRecord extends Record {
  // ...  
}

store.defineMapper('user', {
  recordClass: class UserRecord extends BaseCustomRecord { /*...*/ }
});
store.defineMapper('post', {
  recordClass: class PostRecord extends BaseCustomRecord { /*...*/ }
});
store.defineMapper('comment', {
  recordClass: class CommentRecord extends BaseCustomRecord { /*...*/ }
});

// etc. etc.

Here are some plunker that show extending some classes with JSData 3.x:

  • http://plnkr.co/edit/8xXqpb
  • https://plnkr.co/edit/HYu2NT

And the API docs are a handy resource when extending classes: http://api.js-data.io/js-data/latest/index.html

like image 144
jdobry Avatar answered Oct 20 '22 07:10

jdobry