maths.ts
Version:
Math utilities library for TypeScript, JavaScript and Node.js
262 lines (193 loc) • 6.22 kB
Markdown
# 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.