What is the reason behind TypeScript not generating an error for this particular mapped type?

type JsonType<T> = {
  [P in keyof T as Exclude<P, "salt" | "hash">]: string;
};

type Test = {
  salt: string;
  hash: string;
};

const testObject: JsonType<Test> = {
  hash: "...",
  salt: "...",
};

I am puzzled as to why I am not receiving any errors when defining an object named testObject of type JsonType<Test>. Even though I excluded "salt" and "hash" from the type, I can still use them in an object when they should be considered invalid.

Even after trying the modified code below, the issue remains unresolved:

type JsonType<T> = {
  [P in Exclude<keyof T, "salt" | "hash">]: string;
};

Answer №1

Initially, your JsonType<Test> will ultimately lead to Record<never, string>, representing an object with no keys at all:

// never
type Keys = Exclude<keyof Test, 'salt' | 'hash'>

Due to the lack of strict type checking in TypeScript, it allows for the assignment of additional properties to this variable without triggering a type error. This choice in design is deliberate to simplify handling complex types under different circumstances.

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

Fetching Unicode block specials using axios in getStaticProps with Next.js

Click here to view the code and data results My attempt using the fetch method was successful, but I encountered issues when trying to use 'axios' ...

A foundational NodeJS program in TypeScript featuring a structured client-utility-definition setup with adherence to stringent coding guidelines

What is the best way to set up a basic TypeScript framework for starting a program with strict settings, based on the following program structure? An initial "client" code containing the actual program logic A separate "utility" module for defining funct ...

Issues with the compatibility of the latest JSX Transform, featuring React 16.14, Typescript 4.1.0-beta, and react-scripts 4.0.0-next.98 have

Referencing the information from this source. Here is a snippet from my package.json file: "react": "^16.14.0", "react-dom": "^16.14.0", "react-scripts": "4.0.0-next.98", "typescript": ...

Is it possible to omit the expression of <T> when it is not necessary to define?

Is there a way to write code without using the <T> notation when it's not necessary? Here is what I have in mind: interface Props<?T> { className: string data?: T } const props: Props = {className: "hello, world"} const pro ...

Issue with TypeScript while trying to define a property of a named function expression using 'let' instead of 'const'

As I continued my journey through the TypeScript handbook, I stumbled upon an intriguing concept while learning about Call Signatures. The code snippet provided in the handbook goes like this: type DescribableFunction = { description: string; (someArg: n ...

Pause until the user selects either the confirm or deny option before proceeding with the next action

As a beginner in Angular, I am seeking help with my code structure. I have three files: WarningComponent (which displays a warning modal using Bootstrap), modalService (responsible for opening modals), and votingComponent. Within the votingComponent, ther ...

Discovering the ReturnType in Typescript when applied to functions within functions

Exploring the use of ReturnType to create a type based on return types of object's functions. Take a look at this example object: const sampleObject = { firstFunction: (): number => 1, secondFunction: (): string => 'a', }; The e ...

A function that takes an array of objects and combines all their keys to create a single unified object representing all the information

I have a JavaScript function that accepts an array containing zero or more objects of type {string => async fn*(...) => ...} (with the asterisk indicating async generator functions). This function will output a single object which combines all keys ...

Using a split string to destructure an array with a mix of let and const variables

There is a problem with TS: An error occurs stating that 'parsedHours' and 'parsedMinutes' should be declared as constants by using 'const' instead of 'prefer-const'. This issue arises when attempting to destructure ...

Create an instance of a TypeScript class within an Angular HTML template

Can TypeScript and Angular (6) be used in conjunction for this question? Here is a model class example: export class DropData { private readonly _originType: Component; private readonly _originRow: number; private readonly _originCol: number; ...

How come this constant can be accessed before it has even been declared?

I find it fascinating that I can use this constant even before declaring it. The code below is functioning perfectly: import { relations } from 'drizzle-orm' import { index, integer, pgTable, serial, uniqueIndex, varchar } from 'drizzle-orm ...

Error message: "Trying to assign a value to a property that is not defined in Angular

I am encountering an issue while trying to set the reviews for an Angular 2 project. When I try to assign a value to this.reviews = targ, I receive an error message: TypeError: Cannot set property 'reviews' of undefined. However, I know that targ ...

Assign the element to either interface A or interface B as its type

Is there a way to assign a variable to be of type interface A OR interface B? interface A { foo: string } interface B { bar: string } const myVar: A | B = {bar: 'value'} // Error - property 'foo' is missing in type '{ bar: s ...

Can a Python script be executed asynchronously in a TypeScript fashion?

Currently, I have a Python script that sends an http request to a microservice, and the request typically takes 3 seconds to complete. Here is a summary of my Python script: def main(): response = request_to_MS(url) # This part of the process doesn& ...

A guide to effectively utilizing spread props in React with Typescript and styled-components

As I develop a UI component for my application to ensure consistent styling, I require access to spread props for functionalities like value, onChange, and more. This is the current structure of my TextInput component: import { DetailedHTMLProps, InputHTM ...

A Defer statement in TypeScript that mimics Go's functionality

Is there an equivalent to Go's Defer statement in TypeScript? I find it tedious to write cleanup code in various parts of a function. Searching for a simpler alternative. I tried searching on Google, but couldn't locate any relevant information ...

The process of retrieving information from an AngularFire2 function

I am facing an issue while trying to create a variable using a function from AngularFire2. The function I am using is authorizeUser(). However, when I try to assign the result of this function to this.user, the console window displays 'undefined' ...

Karma's connection was lost due to a lack of communication within 10000 milliseconds

The Karma test suite is encountering issues with the following message: Disconnected, because no message in 10000 ms. The tests are not running properly. "@angular/core": "7.1.3", "jasmine-core": "3.3.0", "karma-jasmine": "1.1.2", The failure seems t ...

Issue: The function "generateActiveToken" is not recognized as a function

I encountered an issue in my Node.js project and I'm unsure about the root cause of this error. Within the config folder, there is a file named generateToken.js which contains the following code snippet: const jwt = require('jsonwebtoken'); ...

The 'replace' property is not found in the 'IData' type. What is the missing piece?

I am trying to implement a cast function that can handle strings containing numbers as input. Unfortunately, I am encountering an issue with the "replace()" method when using regex. Does anyone know how I can define the use of "replace()" within the IData ...