PowerShell is great. But let's be honest, the syntax is odd. Why do I need -eq instead of ==? Why can't I just declare a variable with a type like every other language? Why is Write-Output so many characters? It's just weird.
TypeShell fixes that. It's a PowerShell 7 module that sits on top of your existing shell and transpiles a more familiar, strongly-typed syntax into native PowerShell in real time, as you type.
No new runtime. No breaking changes. Just PowerShell, with less friction.
When you type this:
string name = "Cameron"
int count = 42
const string greeting = "hello"
TypeShell turns it into this before PowerShell ever sees it:
[string]$name = "Cameron"
[int]$count = 42
New-Variable -Name greeting -Value ([string]"hello") -Option ConstantSame thing with operators. Type == and it becomes -eq. Type != and it becomes -ne. Type > and it becomes -gt. You get the idea.
| TypeShell | PowerShell |
|---|---|
string name = "hi" |
[string]$name = "hi" |
int count = 5 |
[int]$count = 5 |
bool flag = $true |
[bool]$flag = $true |
float pi = 3.14 |
[float]$pi = 3.14 |
double val = 1.23 |
[double]$val = 1.23 |
const string x = "hi" |
New-Variable -Name x -Value ([string]"hi") -Option Constant |
Just use what you already know from literally every other language:
| You type | PowerShell gets |
|---|---|
== |
-eq |
!= |
-ne |
> |
-gt |
< |
-lt |
>= |
-ge |
<= |
-le |
Because life is too short for Invoke-RestMethod:
| Alias | Command |
|---|---|
Print |
Write-Output |
PrintError |
Write-Error |
Find |
Get-ChildItem |
Grep |
Select-String |
Filter |
Where-Object |
Iterate |
ForEach-Object |
Fetch |
Invoke-RestMethod |
Request |
Invoke-WebRequest |
Procs |
Get-Process |
...and many more. See BaseAliases.ps1 for the full list.
- PowerShell 7.0+ — this won't work on Windows PowerShell 5.1
- PSReadLine — ships with PowerShell 7 by default, so you're probably fine
# Import the module
Import-Module TypeShell
# Turn on TypeShell
Enable-TypeShell
# Now just type normally
string name = "Cameron"
int age = 25
Print "hello world"
# Turn it off when you're done
Disable-TypeShellThat's it. No config files, no build steps, no ceremony.
TypeShell hooks into PSReadLine's key handlers. When you press Enter, it checks your input against a set of regex patterns. If something matches, it swaps in the PowerShell equivalent before the line gets executed. If nothing matches, it just submits the line normally. Your shell keeps working exactly like it always did, TypeShell only kicks in when it recognizes its own syntax.
Operators work similarly, but they trigger on the = key and Spacebar so the conversion happens as you type, not when you submit.
TypeShell/
├── TypeShell.psd1 # Module manifest
├── TypeShell.psm1 # Module loader
├── public/
│ ├── Enable-TypeShell.ps1
│ └── Disable-TypeShell.ps1
├── private/
│ ├── Types.ps1 # Type declaration transpiler
│ ├── Operators.ps1 # Operator transpiler
│ └── BaseAliases.ps1 # Cmdlet aliases
└── src/ # C# engine (in development)
There's a lot more coming.
- Pipeline shortcuts (
it→$_) - Simpler string interpolation
- Simpler null checks
- Line continuation with
\instead of backtick - Improved Match expressions
- Array/hashtable syntax shortcuts
- Native error handling
Along with a C# transpiler engine so that you can write TypeShell scripts natively.
Cameron Day
GNU General Public License v3.0 (c) 2026 Cameron Day. All rights reserved.