Check that your function arguments have correct types at run-time!
import {validate} from './validate'
const validGetUserArgs = Object.freeze({
authToken: '',
pubkey: new PublicKey()
atTime: new Date()
})
type GetUserArgs = typeof validGetUserArgs
function getUser(args: GetUserArgs) {
validate(args, validGetUserArgs)
checkToken(args.authToken)
db.get({pubkey: args.pubkey, at: args.atTime})
}
And here's one definition of that validate
function:
function validate<T>(obj: T, valid: T) {
for (const k in valid) if (!(k in obj)) throw Error(`missing key ${k}`)
for (const k in obj) if (!(k in valid)) throw Error(`unknown key ${k}`)
for (const k in obj) {
const got = typeof obj[k]
const wanted = typeof valid[k]
if (got !== wanted) {
throw Error(`argument ${k} had type ${got} instead of ${wanted}`)
}
}
}
Demo in typescript playground
Note this is limited. You'll have a headache with unions, optionals, nesting, non-class interfaces, etc.
Top comments (0)