I've been working on TypeScript for over two years now(!) so I thought I'd write a post or two to reflect. I should open with the standard disclaimer: I am just a random engineer at a company with tens of thousands of them, and others surely disagree with the opinions expressed here.
That's all just history. You can argue we shouldn't have gotten to this place but it doesn't change that we're here now. Instead the interesting question is: where do we go now? There are a few options. My perspective is surely biased by the one I prefer.
As a PL enthusiast I'm pretty fond of this idea. I'd like to give it the careful analysis it deserves, but this post is long enough and I think that discussion would work as its own post. Instead of a full refutation, here are some mundane concerns: adopting a different language (1) does nothing for the literally millions of lines of existing code we have — "rewrite from scratch in a new language" is the correct choice for some situations, but it's a hard argument to make as the best use of gmail engineers' time — and (2) it does little for the aforementioned experienced frontend programmers that we would like to hire.
Which leads me to the middle path, which my little team has been pursuing: incrementally adopt some external tooling where it makes sense, by figuring out how to make it interoperate with our existing code base. This task isn't as fun — we don't get to just throw away our legacy mess and "do it right this time" — but I like to think rather more humble, looking outward rather than inward.
Because TypeScript already mostly works — that's part of the reason to adopt it, after all — we get many of the benefits of adopting an established language, from IDE-style code completion to being able to check StackOverflow for answers. The work that's left for us has primarily been integration: allowing our apps to incrementally move into TypeScript without rewriting from scratch. Our integration into the Google-wide build system is careful to compile incrementally, which is critical for large apps; changes in one module that don't affect its exported API don't cause downstream modules to recompile. Our integration into the Closure type/module system means that ES6 TypeScript modules can import Google-module-system modules and the reverse , with (much of) the type information preserved. One company successfully used the tools we published to automatically translate their entire code base while preserving their minified output.