
@andatoshiki/vitepress-plugin-shiki-twoslash 
 Author:Anda Toshiki
 Updated:a day ago
 Words:437
 Reading:2 min
Static code examples for VitePress using Shiki Twoslash — powered by the syntax engine of Visual Studio Code and the TypeScript compiler.
Overview 
Try moving your cursor into the code block below:
ts
tsCreateMutable <Type > = {-readonly [Property in keyofType ]:Type [Property ]}typeLockedAccount = {readonlyid : stringreadonlyname : string}typeUnlockedAccount =CreateMutable <LockedAccount >
tsCreateMutable <Type > = {-readonly [Property in keyofType ]:Type [Property ]}typeLockedAccount = {readonlyid : stringreadonlyname : string}typeUnlockedAccount =CreateMutable <LockedAccount >
Pretty neat, right? To some extent, anything your editor can show you about code, Twoslash can show. For example, here is the real auto-complete for a VitePress config:
ts
tsdefineConfig } from 'vitepress'export defaultdefineConfig ({ti ,})
tsdefineConfig } from 'vitepress'export defaultdefineConfig ({ti ,})
The name Twoslash refers to specially formatted comments (e.g. // ^?) which can be used to set up your environment, like compiler flags or separate input files. It couldn't be easier to set up and start creating incredible code examples!
Install 
Install @andatoshiki/vitepress-plugin-shiki-twoslash (requires vitepress@>=1.0.0-alpha.61).
bash
pnpm add @andatoshiki/vitepress-plugin-shiki-twoslashpnpm add @andatoshiki/vitepress-plugin-shiki-twoslashbash
npm i @andatoshiki/vitepress-plugin-shiki-twoslashnpm i @andatoshiki/vitepress-plugin-shiki-twoslashbash
yarn add @andatoshiki/vitepress-plugin-shiki-twoslashyarn add @andatoshiki/vitepress-plugin-shiki-twoslashWARNING
Until shiki-twoslash uses the same version of shiki as VitePress, you must override the following packages' shiki versions for syntax highlighting to look the same.
json
{
    "pnpm": {
        "overrides": {
            "remark-shiki-twoslash>shiki": "^0.14.1",
            "shiki-twoslash>shiki": "^0.14.1"
        }
    }
}{
    "pnpm": {
        "overrides": {
            "remark-shiki-twoslash>shiki": "^0.14.1",
            "shiki-twoslash>shiki": "^0.14.1"
        }
    }
}Tracked in an upstream issue: https://github.com/shikijs/twoslash/issues/180
Configure 
First, wrap your VitePress config file with the withTwoslash wrapper.
ts
tsdefineConfig } from 'vitepress'import {withTwoslash } from '@andatoshiki/vitepress-plugin-shiki-twoslash'export defaultwithTwoslash (defineConfig ({// Your VitePress config}))
tsdefineConfig } from 'vitepress'import {withTwoslash } from '@andatoshiki/vitepress-plugin-shiki-twoslash'export defaultwithTwoslash (defineConfig ({// Your VitePress config}))
Then, import @andatoshiki/vitepress-plugin-shiki-twoslash/styles.css into your theme.
ts
tsdefaultTheme from 'vitepress/theme'import '@andatoshiki/vitepress-plugin-shiki-twoslash/styles.css'export defaultdefaultTheme 
tsdefaultTheme from 'vitepress/theme'import '@andatoshiki/vitepress-plugin-shiki-twoslash/styles.css'export defaultdefaultTheme 
TIP
You can configure VitePress Twoslash using the twoslash property added to defineConfig.
Add Twoslash 
Finally, add the twoslash attribute to markdown fenced code blocks.
md
```ts twoslash
// Removes 'readonly' attributes from a type's properties
type CreateMutable<Type> = {
    -readonly [Property in keyof Type]: Type[Property]
}
type LockedAccount = {
    readonly id: string
    readonly name: string
}
type UnlockedAccount = CreateMutable<LockedAccount>
//   ^?
``````ts twoslash
// Removes 'readonly' attributes from a type's properties
type CreateMutable<Type> = {
    -readonly [Property in keyof Type]: Type[Property]
}
type LockedAccount = {
    readonly id: string
    readonly name: string
}
type UnlockedAccount = CreateMutable<LockedAccount>
//   ^?
```And your code blocks will be twoslashified!
ts
tsCreateMutable <Type > = {-readonly [Property in keyofType ]:Type [Property ]}typeLockedAccount = {readonlyid : stringreadonlyname : string}typeUnlockedAccount =CreateMutable <LockedAccount >
tsCreateMutable <Type > = {-readonly [Property in keyofType ]:Type [Property ]}typeLockedAccount = {readonlyid : stringreadonlyname : string}typeUnlockedAccount =CreateMutable <LockedAccount >
 Toshiki's Note
Toshiki's Note