flipted-backend
  • Intruction
  • How To Guide
    • Getting Started
    • Use flipted CLI
  • Best Practice
    • Avoid using any type
    • Coding styles
  • Design
    • Data Schema
    • User Authentication
    • Mission - Learning Target Progress Class Diagram
  • API Documentation
    • Class Mission Mastery
    • Class Target Mastery
    • Courses
    • Goals
    • Missions
    • Objectives
    • Questions
    • Quiz Blocks
    • Class Roster
    • SubMissions
    • Targets
    • Tasks
    • Task Submissions
    • Users
    • User Progress
  • Support
    • Defect Reporting
Powered by GitBook
On this page
  • Benefits of type checking
  • Define your own types or interfaces
  • Cases where any is unavoidable

Was this helpful?

  1. Best Practice

Avoid using any type

Benefits of type checking

We are benefited from the type checking (compile time) feature of Typescript in two ways 1. The typescript compiler (built-in feature of VS code) will complaining any mismatch when you assign one type (interface) of an object to another type. For example

type Course = {
   courseName: string;
}

const course: Course = {
   courename: "Integrated Science",
}

Type '{ courename: string; }' is not assignable to type 'Course'.
  Object literal may only specify known properties, but 'courename' does not exist in type 'Course'. Did you mean to write 'courseName'?
  1. The intellisense feature of VS Code also relies on the type system to provide auto-suggestion while we are coding.

However, if we use any for an object, we lose the benefits listed above.

Define your own types or interfaces

  1. With graph-code-generator tool, we can generate all the needed types on the GraphQL side. There are three scienarios where we use these generated types

    • The input type of a service API method

      // service/course.ts
      export async function getCourseInfo(courseId: string): Promise<CourseInfo> {
       ...
      }
    • The return type of a service API method

      // service/course.ts
      export async function addCourse(input: CourseInput): Promise<string> {
       ...
      }
    • The arguments of query request. The QueryCourseContentArgs is generated from GraphQL, and the resolver is the perfect place to use the type.

      // course.resolver.ts
      async function getCourseContent(_: any, args: QueryCourseContentArgs) {
       return service.getCourseContent(args.course);
      }
  2. On the database side, we also need to define [Entity]Item type (interface) to reflect how an entity is stored in the database.

Cases where any is unavoidable

  1. The item(s) in the output from a database query is/are any type. The compiler has no way to figure that out.

  2. When you try to define a type of an object, where the object has some properties that are nested object. In the example below, we don't know what value would be for the expressionAttributeValues

// service/dynamodb.ts
interface interface UpdateParams {
   tableName: string;
   key: string;
   updateExpression: string;
   expressionAttributeValues: { [key: string]: any };
}

Unless there's a strong reason to use any, it's not recommanded in our project.

PreviousUse flipted CLINextCoding styles

Last updated 4 years ago

Was this helpful?

There may be a solution for this at here

Introducing the Amazon DynamoDB DataMapper for JavaScript – Developer Preview