在 TypeScript 中设置来自 `process.argv` 的参数类型,没有类型断言
Set the types of the args from `process.argv` in TypeScript, without type assertions
如何在 TypeScript 中设置从 process.argv
传入的参数的类型,而不使用类型断言?因为使用 as
会强制类型,所以我想尽可能避免这种情况。
我现在拥有的:
type AppName = 'editor' | 'terminal';
function main(args: string[]): void {
const app: AppName = args[0] as AppName;
}
main(process.argv.slice(2))
我想要的(伪代码):
type AppName = 'editor' | 'terminal';
function main(args: string[]): void {
// This doesn't actually work, since `in` doesn't work on `type`.
if (!(args[0] in AppName)) {
throw new Error("The first argument is not an app name.")
}
// The error: Type 'string' is not assignable to type 'AppName'.
const app: AppName = args[0];
}
main(process.argv.slice(2))
有没有类似的可能?有了条件,TS 应该检测到我已经确保第一个 arg 是给定的应用程序名称之一,因此接受将其设置为类型为 AppName
.
的 var
一种方法是使用类型保护。 Here's 关于它的媒体文章
我知道该解决方案,但您可能有更好的解决方案
type AppName = 'editor' | 'terminal';
function isAppName(toBeDetermined: any): toBeDetermined is AppName {
if (toBeDetermined === 'editor' || toBeDetermined === 'terminal') {
return true
}
return false
}
function main(args: string[]): void {
if (!isAppName(args[0])) {
throw new Error("The first argument is not an app name.")
}
const app = args[0]; // const app: AppName
}
Here 是它的工作场所
如何在 TypeScript 中设置从 process.argv
传入的参数的类型,而不使用类型断言?因为使用 as
会强制类型,所以我想尽可能避免这种情况。
我现在拥有的:
type AppName = 'editor' | 'terminal';
function main(args: string[]): void {
const app: AppName = args[0] as AppName;
}
main(process.argv.slice(2))
我想要的(伪代码):
type AppName = 'editor' | 'terminal';
function main(args: string[]): void {
// This doesn't actually work, since `in` doesn't work on `type`.
if (!(args[0] in AppName)) {
throw new Error("The first argument is not an app name.")
}
// The error: Type 'string' is not assignable to type 'AppName'.
const app: AppName = args[0];
}
main(process.argv.slice(2))
有没有类似的可能?有了条件,TS 应该检测到我已经确保第一个 arg 是给定的应用程序名称之一,因此接受将其设置为类型为 AppName
.
一种方法是使用类型保护。 Here's 关于它的媒体文章
我知道该解决方案,但您可能有更好的解决方案
type AppName = 'editor' | 'terminal';
function isAppName(toBeDetermined: any): toBeDetermined is AppName {
if (toBeDetermined === 'editor' || toBeDetermined === 'terminal') {
return true
}
return false
}
function main(args: string[]): void {
if (!isAppName(args[0])) {
throw new Error("The first argument is not an app name.")
}
const app = args[0]; // const app: AppName
}
Here 是它的工作场所