Skip to content

Instantly share code, notes, and snippets.

View edezekiel's full-sized avatar

Edward Ezekiel edezekiel

View GitHub Profile
@edezekiel
edezekiel / index-signature_final.ts
Last active September 8, 2023 03:12
Balance of type safety and flexibility using Record<string, unknown> with spread operator
function parseObject(obj: Record<string, unknown>) {
let doesNotExist = obj['doesNotExist'];
doesNotExist.toString(); // Error: 'doesNotExist' is of type 'unknown'.ts(18046)
doesNotExist += 100; // Error: 'doesNotExist' is of type 'unknown'.ts(18046)
}
parseObject({ ...hero }); // Works
@edezekiel
edezekiel / index-signature_add-index-signature-with-function.ts
Last active September 8, 2023 03:31
Example showing that Functions also satisfy generic Identity index signature
parseObject(
addIndexSignature(() => { console.log('whoops'); }) // This should be an Error
);
@edezekiel
edezekiel / index-signature_add-index-signature.ts
Last active September 8, 2023 03:11
Automatically add index signature to interface
type IndexSignature<T extends {}> = {
[K in keyof T]: T[K];
};
interface Hero { name: string; }
const hero: Hero = { name: 'codey' };
function addIndexSignature<T extends {}>(obj: T): IndexSignature<T> {
return obj;
}
@edezekiel
edezekiel / index-signature_parse-object-record-string-any.ts
Created September 8, 2023 01:09
Type safety issues when using Record<string, any>
function parseObject(obj: Record<string, any>) {
let doesNotExist = obj['doesNotExist']; // ok maybe it's not so bad
doesNotExist.toString(); // yikes
doesNotExist += 100; // double yikes
}
@edezekiel
edezekiel / index-signature_parse-object.ts
Last active September 8, 2023 12:38
parseObject function expected to error when invoked with interface
import { Hero } from 'third-party-library'
const hero: Hero = { name: 'codey' };
function parseObject<T>(obj: Record<string, unknown>) {
return JSON.stringify(obj);
}
parseObject(hero); // Error
@edezekiel
edezekiel / index-signature_number-index-signature-error.ts
Last active September 8, 2023 03:10
Demonstrating an error when you assign a string interface to a number index signature
interface Hero { name: string; }
const hero: Hero = { name: 'codey' };
const generic: { [key: number]: any } = hero; // Error
@edezekiel
edezekiel / index-signature_string-index-signature.ts
Last active September 8, 2023 03:26
Demonstrating that Record<string, any> is not magic
interface Hero { name: string; } // Still no string index signature
const hero: Hero = { name: 'codey' };
const generic: { [key: string]: any } = hero; // Somehow still works with Record
@edezekiel
edezekiel / index-signature_record-string-any-with-interface.ts
Last active September 8, 2023 03:24
No error when assigning interface to Record<string, any> even without index signature
interface Hero { name: string; } // Missing the 'string' index signature
const hero: Hero = { hero: 'codey' };
const generic: Record<string, any> = hero; // No Error. Why? How?
@edezekiel
edezekiel / index-signature_implicit-from-object-literal.ts
Last active September 8, 2023 03:24
Implicit index signature when assigning object literal
const hero = { name: 'codey' } // object literal
const generic: Record<string, unknown> = hero;
@edezekiel
edezekiel / index-signature_interface.ts
Last active September 8, 2023 01:39
Manually define a type signature on an interface
interface Hero {
name: string,
[key: string]: string // Manually add index signature
}
const hero: Hero = { name: 'codey' }
const generic: Record<string, unknown> = hero;