Open goatslacker opened 9 years ago
Probably needs to create TypeScript type definitions too.
I have a branch that started doing that. I don't know typescript too well though
I'm actually bootstrapping a large project based on Alt for all my state needs. I've got a big portion of the typing worked out if this helps. I'm pretty close to having TodoMVC and chat ported over to Typescript.
That would be amazing. I have a local branch which I started working on types based on flow types but since I don't know typescript too well I keep running into compiler issues trying to translate from flow to typescript.
I think what I'd like to add is a d.ts file, unless I'm mistaken?
Correct its a d.ts file. Let me organize what I was working on tonight and I'll have you take a look. The problem I'm running into is that I'm new to Alt and flux so I want to make sure i'm setting up my interfaces in a way that makes sense to those experienced with the library.
todo mvc in typescript - Next I'm going to work on porting over alt-tutorial so we have an example involving async.
I looked over the typescript definitions and they look pretty sound, some small things are changing here and there but I think we can manage that in the next release.
Is the typescript def working out thus far?
I'm working on a quick demo to make sure my definitions for sources compile fine and if thats the case I would say were solid for an initial release. Eventually I'm sure some of the generics could be cleaned up to be a bit more intuitive.
Did we want the example project and some basic docs moved over to this repo to go along with it?
Also I ran into a bit of a problem with moving this over to a typed system in the way that Alt defines stores and actions. A basic example such as the following:
interface State {
todos:{[key:string]:Todo}
}
class TodoStore {
constructor() {
this.bindActions(todoActions);
this.todos = {};
}
//implementation
}
export default const todoStore = alt.createStore<State>(TodoStore);
The above will not compile due to "property bindActions does not exist on TodoStore". The workaround is to implement a dummy class with proper signatures and an empty implementation for TodoStore to inherit such as the following (from my alt-typescript-todomvc example):
interface State {
todos:{[key:string]:Todo}
}
//dummy class - no implementation details are actually used
class StoreModel implements AltJS.StoreModel<State> {
bindActions( ...actions:Array<Object>):void {}
getState():State {
return <State>{};
}
}
class TodoStore extends StoreModel {
todos:{[key:string]:Todo};
constructor() {
//now compiles because bind actions is a known quantity
this.bindActions(todoActions);
this.todos = {};
super();
}
//implementation details
}
Running alt.createActions() shows an identical issue. I think we can release these definitions as is but in a future release I propose that we implement a base class to inherit from such as the following:
import {StoreModel} from "alt";
interface State {
todos:{[key:string]:Todo}
}
class TodoStore extends StoreModel<State> {
todos:{[key:string]:Todo};
constructor() {
//now compiles because bindActions is a known quantity
this.bindActions(todoActions);
this.todos = {};
super();
}
//implementation details
}
This will play much better with a type system and follows pretty closely to what the React team is doing by moving React.createClass(/*implementation*/);
to class CoolComponent extends React.Component { /*implementation*/ }
You can use alt with any transpile to js language.
I'd appreciate some help with alt examples written in