Skip to content

Instantly share code, notes, and snippets.

@zalanlevai
Created August 25, 2020 23:04
Show Gist options
  • Save zalanlevai/890ff294ed13ff5ae4e182f586dfc86b to your computer and use it in GitHub Desktop.
Save zalanlevai/890ff294ed13ff5ae4e182f586dfc86b to your computer and use it in GitHub Desktop.
TypeScript code snippets for discrimated unions and unique types
{
// Place your global snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
// used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
// Placeholders with the same ids are connected.
// Example:
// "Print to console": {
// "scope": "javascript,typescript",
// "prefix": "log",
// "body": [
// "console.log('$1');",
// "$2"
// ],
// "description": "Log output to console"
// }
"Unique Typed Constant": {
"scope": "typescript,typescriptreact",
"prefix": ["utypeconst", "uniquetypedconstant"],
"body": [
"const ${1:Type}Symbol = Symbol(\"${1}\");",
"export interface ${1} {",
"\treadonly type: typeof ${1}Symbol;",
"}",
"export const ${1}: ${1} = { type: ${1}Symbol };",
"export function is${1}(${3:value}: ${2:unknown}): ${3} is ${1} {",
"\treturn (${3} as { type?: symbol }).type === ${1}Symbol;",
"}"
]
},
"Unique Type": {
"scope": "typescript,typescriptreact",
"prefix": ["utype", "uniquetype"],
"body": [
"const ${1:Type}Symbol = Symbol(\"${1}\");",
"export interface ${1} {",
"\treadonly type: typeof ${1}Symbol;",
"}",
"export const ${1}: () => ${1} = () => ({",
"\ttype: ${1}Symbol,",
"});",
"export function is${1}(${3:value}: ${2:unknown}): ${3} is ${1} {",
"\treturn (${3} as { type?: symbol }).type === ${1}Symbol;",
"}"
]
},
"Discriminated Union": {
"scope": "typescript,typescriptreact",
"prefix": ["dunion", "discriminatedunion"],
"body": [
"namespace ${1:Union} {",
"\t${0}",
"}",
"type ${1} =",
"\t| never",
"\t;"
]
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment