VNDB fork of mithril.js
Find a file
Matt Tracy da6d525a11 Typescript: Make MithrilVirtualElement non-generic
`MithrilVirtualElement` was recently converted to be generic over `<T extends
MithrilController>`. The element's `children` may then contain other
`MithrilVirtualElement<T>` or `MithrilComponent<T>` elements.

Unfortunately, in common usage of 'm()' this can cause problems with Mithril's type
inference system. If a type is not explicitly provided to `m()`, the "T" of the
returned MithrilVirtualElement<T> will be inferred from its children. The
candidates for T will be the concrete types of the child MithrilComponent<T>; however, if no
candidate type is a subset of *every* candidate type, then TypeScript will be
unable to infer a valid type, and the call to `m()` will not compile.

To improve this behavior, this commit makes MithrilVirtualElement non-generic;
it's child collection can now contain MithrilComponent<MithrilController>, which
matches all valid MithrilComponent. This the same underlying issue as the
previous commit, which made MithrilRoutes non-generic.

The motivation for fixing this is threefold:

1. Because `m()` has so many overloads, in the case where a call to `m()` will
not compile due to the above issue, the syntax error provided by TypeScript is
not helpful.
2. In many cases, users will be calling `m<MithrilController>()` in their code
simply to get it to compile, which provides no additional utility over a
non-generic type and adds significant boilerplate.
3. Explicitly specifying subtypes to `m()` calls provides little utility; at
best, it can check that contained components implement some common interface.
However, type assertions like that can be provided in other places without
having to attach the information to the MithrilVirtualElement.
2015-10-14 17:27:22 -04:00
deploy #518 fix package.json file for cdn.js 2015-03-30 14:54:20 -04:00
docs fix file size in docs 2015-09-28 22:26:41 -04:00
tests Make m.route.param() return all params #737 2015-08-18 20:44:58 +02:00
.editorconfig tweak editorconfig preferences 2015-04-22 21:00:11 -04:00
.gitattributes Avoid EOL diff horror by enforcing CRLF on commit 2015-04-26 12:53:35 +01:00
.gitignore #686 prevent redraw lock on error 2015-06-23 13:43:54 -04:00
.npmignore adds saucelabs integration to unit tests 2014-07-25 11:23:47 -04:00
.travis.yml Use modern TravisCI platform 2015-10-10 11:04:22 -04:00
dragdrop.html m.module -> m.mount: fix sample code in HTML files 2015-08-28 09:07:08 -03:00
Gruntfile.js bump version 2015-07-23 23:43:38 -04:00
guide.html m.module -> m.mount: fix sample code in HTML files 2015-08-28 09:07:08 -03:00
LICENSE Initial commit 2014-03-16 18:59:39 -07:00
mithril.closure-compiler-externs.js Update externs for Google Closure compiler 2015-08-04 16:57:13 +02:00
mithril.d.ts Typescript: Make MithrilVirtualElement non-generic 2015-10-14 17:27:22 -04:00
mithril.js Make m.route.param() return all params #737 2015-08-18 20:44:58 +02:00
mithril.min.js Merge remote-tracking branch 'upstream/next' into speed, unfix "fixed" version 2015-07-23 05:26:31 -04:00
mithril.min.js.map Merge remote-tracking branch 'upstream/next' into speed, unfix "fixed" version 2015-07-23 05:26:31 -04:00
modulator-test.html Remove trailing whitespace 2015-07-09 03:38:42 -04:00
mvc.html m.module -> m.mount: fix sample code in HTML files 2015-08-28 09:07:08 -03:00
onerror.html clean up 2015-04-13 08:29:03 -04:00
package.json Bump npm version 2015-07-27 18:48:08 -04:00
README.md Update README gzip size statement 2015-09-23 16:41:26 -04:00

JS.ORG Join the chat at https://gitter.im/lhorie/mithril.js Support and Consulting Services Build Status

Mithril

A Javascript Framework for Building Brilliant Applications

See the website for documentation

There's also a blog and a mailing list


What is Mithril?

Mithril is a client-side MVC framework - a tool to organize code in a way that is easy to think about and to maintain.

Light-weight

  • Only 7kb gzipped, no dependencies
  • Small API, small learning curve

Robust

  • Safe-by-default templates
  • Hierarchical MVC via components

Fast

  • Virtual DOM diffing and compilable templates
  • Intelligent auto-redrawing system

Sample code

//namespace
var app = {};

//model
app.PageList = function() {
	return m.request({method: "GET", url: "pages.json"});
};

//controller
app.controller = function() {
	var pages = app.PageList();
	return {
		pages: pages,
		rotate: function() {
			pages().push(pages().shift());
		}
	}
};

//view
app.view = function(ctrl) {
	return [
		ctrl.pages().map(function(page) {
			return m("a", {href: page.url}, page.title);
		}),
		m("button", {onclick: ctrl.rotate}, "Rotate links")
	];
};


//initialize
m.mount(document.getElementById("example"), app);

Learn more