A tool for generating and managing TypeScript type definitions efficiently.
import*asassertfrom"node:assert";import{typeChecker,ensure,isString,isPositiveSafeInteger,isArrayOf,isDictionaryOf,isOptionalOf,}from"@nlib/typing";// For example, there is a interface named User.interfaceUser{id:number;name:string;}// You can create a TypeChecker for User with typeChecker().constisUser=typeChecker({id:isPositiveSafeInteger,name:isString,});// typeChecker<T>() returns TypeChecker<T> which is a type guard for T.// https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates// i.e. TypeChecker<User> is (value: unknown) => value is Userassert.equal(isUser({id:1,name:"a"}),true);assert.equal(isUser({id:"1",name:"a"}),false);// You can handle a response with confidence using ensure().constresponse=awaitfetch("https://jsonplaceholder.typicode.com/users/1");constmember=ensure(awaitresponse.json(),isUser);console.info(`member.id:${member.id}`);console.info(`member.name:${member.name}`);// isArrayOf returns TypeChecker<Array<T>>.constisUserArray=isArrayOf(isUser);assert.equal(isUserArray([{id:1,name:"a"},{id:2,name:"b"},{id:3,name:"c"},]),true,);// isDictionaryOf returns TypeChecker<Record<string, T>>.constisUserDictionary=isDictionaryOf(isUser);assert.equal(isUserDictionary({a:{id:1,name:"a"},b:{id:2,name:"b"},c:{id:3,name:"c"},}),true,);// isOptionalOf returns TypeChecker<T | undefined>.constisItem=typeChecker({id:isPositiveSafeInteger,name:isOptionalOf(isString),});assert.equal(isItem({id:1}),true);assert.equal(isItem({id:1,name:"a"}),true);assert.equal(isItem({id:1,name:1}),false);// Example: Tree structureinterfaceNode{id:string;children?:Array<Node>;}constisNode=typeChecker({// You can use regular expression for defining a string pattern.id:/^[0-9a-z]+$/,// You can't use isNode here because isNode is not defined yet.// Use getter for recursive type definition.getchildren(){returnisOptionalOf(isArrayOf(isNode));},});assert.equal(isNode({id:"a"}),true);assert.equal(isNode({id:"a",children:[]}),true);assert.equal(isNode({id:"a",children:[{id:"b"}]}),true);assert.equal(isNode({id:"a",children:[{id:"b",children:[{id:"c"}]}]}),true,);assert.equal(isNode({id:"a",children:[{id:"b",children:[{id:"C"}]}]}),// id: "C" is invalid because it is not lowercase.false,);