TypeScript
![](https://s3.amazonaws.com/media-p.slid.es/uploads/957224/images/6129092/pasted-from-clipboard.png)
Why and how we adopted it at Slack
Hi, I'm Felix
www.felix.fun
@felixrieseberg
Senior Staff Engineer, Slack
![](https://media1.giphy.com/media/3oKIPuvcQ6CcIy716w/giphy.gif)
Battlefield 1
Nvidia GeForce Experience
Adobe
Creative Suite
All the Electron Apps
Welcome to 2019
JavaScript isn’t just the most popular programming technology - Node.js is everywhere
JavaScript is used to build sophisticated applications.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/957224/images/6106128/pasted-from-clipboard.png)
😰
More JavaScript,
More Worries
-
Vanilla JavaScript requires source code study
-
JSDoc/ESDoc requires trust in your fellow developer
-
Both methods are inefficient, frustrating, and failure-prone
Handling Large Code Bases
📚
/**
* @param {Object} options
* @param {string} options.prop1
* @param {number} options.prop2
* @param {number} [options.prop3=42]
*
* @returns {number}
*/
function myMethod(options) {
const { prop2, prop3 } = options
return prop1 * (prop3 || 42)
}
Handling Large Code Bases
📚
More JavaScript,
More Worries
-
Vanilla JavaScript requires source code study
-
JSDoc/ESDoc requires trust in your fellow developer
-
Both methods are inefficient, frustrating, and failure-prone
TypeScript
To the Rescue
-
Superset of JavaScript
-
No modification of code at runtime
-
Excellent editor support
-
Excellent integration with the npm world
-
And of course… types.
Handling Large Code Bases
📚
Demo Time
Starting the TypeScript Compiler
Modern JavaScript is valid TypeScript. You can use the compiler without changing a single line of code.
Porting Slack's App
👷♂️
Slowly port files over
We have features to ship and bugs to fix - we slowly ported file by file.
You’ll quickly dislike working with files not ported over.
Porting Slack's App
👷♂️
Committing with confidence
TypeScript gives us a guarantee that the structural dependencies in the code are sound.
Porting Slack's App
👷♂️
It might look scary
Advanced use of TypeScript involves interfaces, type declarations, and enums.
Nothing new for a developer who’s seen Java, C#, or other typed languages, but possible scary to junior JavaScript devs.
Porting Slack's App
👷♂️
Porting Slack's App
👷♂️
declare type Promisify<T> = T extends Promise<any> ? T : Promise<T>;
type ProxiedObject<T> = {
[P in keyof T]: T[P] extends (...args: infer Arguments) => infer R
? (...args: Arguments) => Promisify<R>
: ProxiedObject<T[P]>
};
export { ProxiedObject };
Slack's most difficult lines of TypeScript
🏆
www.felix.fun
Thank you for your interest
TypeScript: Why and how we adopted it at Slack
By Felix Rieseberg
TypeScript: Why and how we adopted it at Slack
- 2,313