javascript - Hur skapar man en typ i TypeScript som kommer att matcha en sträng mot regex?
Jag skulle vilja skapa några nya strängtyper i TypeScript som kommer att visa ett fel om de inte matchar ett mönster. Till exempel skulle jag vilja skapa dessa typer som kommer att matcha ett regex-mönster.
type UnixFilesystemPath = '/something/something/something'
type WindowsFilesystemPath = 'X:\something\something'
type FtpPath = 'ftp://something/something'
let unixFile = 'test' // error
let unixFile = '/home/martin/script.sh' // ok
let unixFile = '/var/' // ok
Är detta möjligt med TypeScript?
Svar #1
Efter mycket letande verkar det som att den enda lösningen (som jag har hittat) är att skapa egna klasser för dessa typer av "typer". Till exempel, om jag ville ha en UnixAbsolutePath-typ så skulle jag kunna skapa något som detta.
Vänligen rätta mig om jag har fel eller om det finns en bättre lösning. Det enda problemet med detta är att när du försöker setPath() kommer det inte att ge ett kompileringsfel utan bara ett körfel.
class UnixAbsolutePath {
/**
* Unix Absolute Path
* Can be a path to a directory or a path to a file.
*
* Examples: /bin/bash, /var/log/
*/
private path: string
constructor(path: string) {
this.path = this.validated(path)
}
public getPath(): string {
return this.path
}
public setPath(path: string): void {
this.path = this.validated(path)
}
private validated(path: string): string {
const regex = new RegExp('^(/[^/ ]*)+/?$')
if (!regex.test(path)) {
throw new TypeError(`${path} is not a valid unix filesystem path.`)
}
return path
}
}
let bashPath: UnixAbsolutePath = new UnixAbsolutePath('/bin/bash')
console.log(bashPath.getPath()) // [LOG]: "/bin/bash"
bashPath = 'myfile.sh' // Type 'string' is not assignable to type 'UnixAbsolutePath'
bashPath.setPath('myfile.sh') // Only runtime error - myfile.sh is not a valid unix filesystem path.
