UNPKG

maths.ts

Version:

Math utilities library for TypeScript, JavaScript and Node.js

262 lines (193 loc) 6.22 kB
# Maths.ts StyleGuide and Coding Conventions > StyleGuide is Based on an unofficial [TypeScript StyleGuide](https://github.com/basarat/typescript-book/blob/master/docs/styleguide/styleguide.md). You can check the same guideline on the link mentioned. Key Sections: * [Variable](#variable-and-function) * [Class](#class) * [Interface](#interface) * [Type](#type) * [Namespace](#namespace) * [Enum](#enum) * [`null` vs. `undefined`](#null-vs-undefined) * [Formatting](#formatting) * [Single vs. Double Quotes](#quotes) * [Tabs vs. Spaces](#spaces) * [Use semicolons](#semicolons) * [Annotate Arrays as `Type[]`](#array) * [File Names](#filename) ## Variable and Function * Use `camelCase` for variable and function names > Reason: Conventional JavaScript **Bad** ```ts var FooVar; function BarFunc() { } ``` **Good** ```ts var fooVar; function barFunc() { } ``` ## Class * Use `PascalCase` for class names. > Reason: This is actually fairly conventional in standard JavaScript. **Bad** ```ts class foo { } ``` **Good** ```ts class Foo { } ``` * Use `camelCase` of class members and methods > Reason: Naturally follows from variable and function naming convention. **Bad** ```ts class Foo { Bar: number; Baz() { } } ``` **Good** ```ts class Foo { bar: number; baz() { } } ``` ## Interface * Use `PascalCase` for name. > Reason: Similar to class * Use `camelCase` for members. > Reason: Similar to class * **Don't** prefix with `I` > Reason: Unconventional. `lib.d.ts` defines important interfaces without an `I` (e.g. Window, Document etc). **Bad** ```ts interface IFoo { } ``` **Good** ```ts interface Foo { } ``` ## Type * Use `PascalCase` for name. > Reason: Similar to class * Use `camelCase` for members. > Reason: Similar to class ## Namespace * Use `PascalCase` for names > Reason: Convention followed by the TypeScript team. Namespaces are effectively just a class with static members. Class names are `PascalCase` => Namespace names are `PascalCase` **Bad** ```ts namespace foo { } ``` **Good** ```ts namespace Foo { } ``` ## Enum * Use `PascalCase` for enum names > Reason: Similar to Class. Is a Type. **Bad** ```ts enum color { } ``` **Good** ```ts enum Color { } ``` * Use `PascalCase` for enum member > Reason: Convention followed by TypeScript team i.e. the language creators e.g `SyntaxKind.StringLiteral`. Also helps with translation (code generation) of other languages into TypeScript. **Bad** ```ts enum Color { red } ``` **Good** ```ts enum Color { Red } ``` ## Null vs. Undefined * Prefer not to use either for explicit unavailability > Reason: these values are commonly used to keep a consistent structure between values. In TypeScript you use *types* to denote the structure **Bad** ```ts let foo = {x:123,y:undefined}; ``` **Good** ```ts let foo:{x:number,y?:number} = {x:123}; ``` * Use `undefined` in general (do consider returning an object like `{valid:boolean,value?:Foo}` instead) ***Bad*** ```ts return null; ``` ***Good*** ```ts return undefined; ``` * Use `null` where its a part of the API or conventional > Reason: It is conventional in NodeJS e.g. `error` is `null` for NodeBack style callbacks. **Bad** ```ts cb(undefined) ``` **Good** ```ts cb(null) ``` * Use *truthy* check for **objects** being `null` or `undefined` **Bad** ```ts if (error === null) ``` **Good** ```ts if (error) ``` * Use `== undefined` / `!= undefined` (not `===` / `!==`) to check for `null` / `undefined` on primitives as it works for both `null`/`undefined` but not other falsy values (like `''`,`0`,`false`) e.g. **Bad** ```ts if (error !== null) ``` **Good** ```ts if (error != undefined) ``` PS: [More about `null`](../tips/null.md) ## Formatting The TypeScript compiler ships with a very nice formatting language service. Whatever output it gives by default is good enough to reduce the cognitive overload on the team. Use [`tsfmt`](https://github.com/vvakame/typescript-formatter) to automatically format your code on the command line. Also your IDE (atom/vscode/vs/sublime) already has formatting support built-in. Examples: ```ts // Space before type i.e. foo:<space>string const foo: string = "hello"; ``` ## Quotes * Prefer single quotes (`'`) unless escaping. > Reason: More JavaScript teams do this (e.g. [airbnb](https://github.com/airbnb/javascript), [standard](https://github.com/feross/standard), [npm](https://github.com/npm/npm), [node](https://github.com/nodejs/node), [google/angular](https://github.com/angular/angular/), [facebook/react](https://github.com/facebook/react)). Its easier to type (no shift needed on most keyboards). > Double quotes are not without merit: Allows easier copy paste of objects into JSON. Allows people to use other languages to work without changing their quote character. Allows you to use apostrophes e.g. `He's not going.`. But I'd rather not deviate from where the JS Community is fairly decided. * When you can't use double quotes, try using back ticks (\`). > Reason: These generally represent the intent of complex enough strings. ## Spaces * Use `2` spaces. Not tabs. > Reason: More JavaScript teams do this (e.g. [airbnb](https://github.com/airbnb/javascript), [idiomatic](https://github.com/rwaldron/idiomatic.js), [standard](https://github.com/feross/standard), [npm](https://github.com/npm/npm), [node](https://github.com/nodejs/node), [google/angular](https://github.com/angular/angular/), [facebook/react](https://github.com/facebook/react)). The TypeScript/VSCode teams use 4 spaces but are definitely the exception in the ecosystem. ## Semicolons * Use semicolons. > Reasons: Explicit semicolons helps language formatting tools give consistent results. Missing ASI (automatic semicolon insertion) can trip new devs e.g. `foo() \n (function(){})` will be a single statement (not two). ## Array * Annotate arrays as `foos:Foo[]` instead of `foos:Array<Foo>`. > Reasons: Its easier to read. Its used by the TypeScript team. Makes easier to know something is an array as the mind is trained to detect `[]`. ## Filename Name files with `camelCase`. E.g. `accordian.tsx`, `myControl.tsx`, `utils.ts`, `map.ts` etc. > Reason: Conventional across many JS teams.