1.0.4 • Published 2 years ago

default-interface v1.0.4

Weekly downloads
-
License
ISC
Repository
github
Last release
2 years ago

default-interface

Typescript interfaces with default values. Document default parameters in your .d.ts declaration file. Tell your library users what those optional args really default to!

npm i default-interface

Example usage

// printUser.ts
import DefaultInterface from 'default-interface'

const defaults = {
    topFruit: 'orange',
    isPro: false,
} as const

type User = DefaultInterface<{
    id: number
    token: string
}, typeof defaults>

export function print(user: User) {
    const { topFruit, isPro, id, token } = { ...defaults, ...user }
    const proText = isPro ? 'a pro' : 'not a pro'
    return `A user named ${id} (${token}) loves ${topFruit}s and is ${proText}`
}
/** If you need the required version of an interface then it's one line */
export function makeUser(partial: User): Required<User> {
    return { ...defaults, ...partial }
}

If you run tsc --declaration then printUser.d.ts will have:

declare const defaults: {
    readonly topFruit: "orange";
    readonly isPro: false;
};
declare type User = DefaultInterface<{
    id: number;
    token: string;
}, typeof defaults>;
declare function print(user: User): string;
declare function makeUser(partial: User): Required<User>;

We have documented the default arguments in our types!!

Checklist

  • ✅ booleans
  • ✅ numbers
  • ✅ strings
  • ✅ array literals and arrays
  • ✅ object literals and records

Unfortunately that's all that typescript lets you put in declaration files. So defaults that are BigInts or class instances won't show up, but you rarely use those as parameters anyway.

What if I use default destructured args the normal way?

Try making a file like this and running tsc -d:

function sayMany({ times = 10, word }: { times?: number; word: string }) {
    console.log(word.repeat(times))
}

You'll get a declaration like this, and it will be very difficult for the users of your package to determine what happens when they don't specify times:

declare function sayMany({ times, word }: {
    times?: number;
    word: string;
}): void;
npm i default-interface
1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago