A utility type in Typescript for managing default database schema values

I am currently exploring a method for incorporating default and virtual values in a database schema. The concept involves using a utility type to automatically convert a schema for insertion (props with defaults or generated by virtuals aren't necessary) and as a query result (ensuring that these fields will be populated by defaults or other "virtual"-like settings so they can be classified as NonNullable).

For example, simplifying typings to a single prop:

type WithDefault<T> = T;
// Mark prop as optional
type Input<T> = T extends WithDefault<infer T> ? T | undefined : T;

The challenge lies in the fact that there is no distinction between Input<WithDefault> and Input.

Do you have any suggestions on how to achieve a pattern like this? The goal is to have a schema similar to:

type User = {
  firstName: string
  lastName: string
  fullName: WithDefault<string>
}

This would allow for seamlessly transitioning between an insertable schema and a readable schema.

Answer №1

The issue at hand, as you mentioned, lies in the fact that the types are structurally identical, causing TS to treat them interchangeably.

To differentiate between the two, you can assign a unique property with a type of never. The drawback is introducing a property that should not exist, but using a Symbol can help ensure its uniqueness.

Check out the code snippet below (accessible on the TS playground here):

const __hasDefault = Symbol('__hasDefault');

type WithDefault<T> = T & { [__hasDefault]: never }

type User = {
  firstName: string
  lastName: string
  fullName: WithDefault<string>
}

type ConvertSchema<S extends object> = {
  [key in keyof S]: S[key] extends WithDefault<infer T> ? T | undefined : S[key];
}

type result = ConvertSchema<User>;

By implementing this, you will achieve the following outcome. Does this meet your requirements?

https://i.sstatic.net/qlY69.png

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

React-aria | Encountering a typescript error with input fields/textfields

Seeking assistance with using react-aria, specifically the useTextField feature. Despite following the documentation available at , I encountered an error related to the input element. Any help would be appreciated. Code import { AriaTextFieldOptions, use ...

Defining the type of the createAction() function in TypeScript within the context of Redux Toolkit

Lately, I have been delving into the redux-toolkit library but I am struggling with understanding the type declaration of the createAction function as demonstrated below. The createAction function returns a PayloadActionCreator which includes a generic of ...

The debate between using "this" versus "classname" to access static elements in

When working with TypeScript, I've observed that there are multiple valid approaches for accessing a static class member. class MyClass { private static readonly FOO: string = "foo"; public DoSomething(): void { console.log(MyClass.FOO);} pu ...

A layout featuring nested buttons and links within a card element, utilizing the power of Link in NextJs

After extensive searching on S.O., I have been unable to find a solution that works flawlessly. The issue at hand involves a card component in a NextJs application that is encompassed within a <Link> tag. Additionally, there is another <Link> t ...

Guide on setting an array as the data for counts in charts.js

I am working with a chart.js graph and I need to assign an array to the data property. Below is my current code snippet: datasets: [ { data:[40,56,345,2354], backgroundColor: "#007BA7", hoverBackgroundColor: "#00CC99" } ] Howeve ...

Utilize decorators for enhancing interface properties with metadata information

Can decorators be utilized to add custom information to specific properties within an interface? An example can help clarify this: Interface for App state: export interface AppState { @persist userData: UserData, @persist selectedCompany: UserCo ...

Encountering the error "Cannot access property 'on' of undefined" during Angular unit testing with Karma and Jasmine

Inside my component.ts file, I have a service called 'socketService' that utilizes socket functionality. Within the component, I include the following code: this.socket = this.socketService.getSocketIOConnector(this.data.product) this.socket.on(& ...

Can I leverage getStaticProps and getStaticPaths within a page component that employs dynamic routing without prior knowledge of the IDs?

I have created a fully static site generation (SSG) app where the backend cannot be accessed during build time. All the data is specific to user permissions, so I cannot specify paths in the getStaticPaths method required for dynamic routed components us ...

What could be causing my icon to not update when I click on it? (ionic/vue/ts)

Hey there, I'm having trouble changing my icon on click and I can't figure out why. Here's the template I'm using: <button> <ion-icon class="marge-image" :icon="onChange ? heart : heartOutline" @click=&quo ...

Tips for testing an Angular 6 service with a dependency that utilizes private methods and properties to alter the output of public methods and properties

I've encountered a challenge while attempting to write a Jasmine/Karma test for an Angular 6 app. The test is for a service in my application that relies on another service with private properties and methods, causing my tests to consistently fail. W ...

How can you define a type in Typescript that encompasses all types that are derived from a shared type?

TLDR: How can I declare a type in Typescript that covers all types extending a specific interface? Issue Description I am working on a custom React hook that handles logic for determining if an element is being hovered over. The design is loosely based o ...

Why is it not possible to declare an interface or type within a TypeScript class?

I am struggling to define interface | type within a TypeScript class. Here is the code snippet: class MyClass { interface IClass { name: string, id: string } } However, I keep encountering this error: Unexpected token. A constructo ...

When the month changes in the React AntDesign Calendar Component, it automatically selects the last chosen day

My goal is to store the selected day in the state when a user clicks on a specific date. However, I am encountering an issue where the previously selected day remains saved in the state even after changing the month. Upon logging the onSelect event to the ...

I am experiencing import issues with ts-node/ts-jest and unable to import the necessary modules

I'm having trouble with a syntax error while trying to integrate mdast-util-from-markdown into my Jest tests for a TypeScript project. I am seeking a solution that does not involve using Babel. The code functions properly when using ts-node. Issue: ...

Obtain values from a specific set, and then filter out values from an array that correspond to the index of that set into distinct arrays

The Problem I'm Facing Currently, I am dealing with a large data table that contains a mix of relevant and irrelevant data. My goal is to filter out the information I care about and display it in a more concise table. Using RegEx, I have managed to i ...

Find any consecutive lowercase or uppercase letter and include one more

I have a task in Javascript that I need help with. The goal is to insert a special character between a lowercase and uppercase letter when they are matched together. For example: myHouse => my_House aRandomString => a_Random_String And so on... T ...

Tips for including and excluding personalized Chips from input

Just started learning React/typescript, any assistance would be greatly appreciated Custom Chip (CC.chip) is a specialized Chip UI component that can be utilized as demonstrated below. const [isOpen, setIsOpen] = useState(true); const onClose = Re ...

If the parent is optional, types cannot be obtained

I'm trying to set the type ShowOptions as "ALL", "ACTIVE", or "DRAFT" However, I encountered an error saying TS2339: Property show does not exist on type Does anyone have suggestions on how I can extract the ShowOptions ...

Describing the implementation of UNO out parameters within definitions

The UNO API offers support for inout and out parameters. In this scenario, a variable is passed into a function, the function modifies the variable, and the updated value of the variable can be accessed outside the function. Javascript lacks native suppor ...

Implementing Facebook Javascript SDK to enable login and trigger re-authentication using React Web and Typescript within a component

As a newcomer to stack overflow, I welcome any suggestions on how I can improve my question. I'm in need of guidance concerning logging a user into facebook and requiring them to authenticate their profile or select another profile manually, rather t ...