假设我有以下代码
const publicPath: string | undefined = config.output && config.output.publicPath
invariant(publicPath, "No publicPath for config: ${config}")
// declare const publicPath: string // error
我知道invariant
publicPath
之后非空(如果是,程序会停止),怎么说打字稿?
即使这不起作用
function invariant<T>(s: T | undefined | null, msg): s is T | never {
if (!s)
throw new Error(msg)
return true
}
const publicPath: string | undefined = '/* ... */'
invariant(publicPath, "No publicPath for config: ${config}")
// publicPath still string
答案 0 :(得分:1)
您可以使用更严格的类型声明一个新变量:
const configuredPublicPath: string | undefined = config.output && config.output.publicPath
const publicPath: string = invariant(configuredPublicPath,
"No publicPath for config: ${config}")
Playground demo link here(请务必点击Options -> strictNullChecks
)。
答案 1 :(得分:1)
不可能。
你可以这样做:
const publicPath: string | undefined = /* ... */
invariant(publicPath, "No publicPath for config: ${config}")
const publicPath2 = publicPath as string
或者,我建议:
function invariant(s: string | undefined, msg): string {
if (!s)
throw new Error(msg)
return s
}
const publicPath = invariant(config.output && config.output.publicPath, "No publicPath for config: ${config}")
注意:如果配置类型不是所有字符串,请使用泛型:
function invariant<T>(s: T | undefined, msg): T {
if (!s)
throw new Error(msg)
return s
}
答案 2 :(得分:1)
您可以使用not-null断言运算符(!
)断言变量不为null且未定义:
const publicPath: string | undefined = config.output && config.output.publicPath
invariant(publicPath, "No publicPath for config: ${config}")
const nonNullPublicPath: string = publicPath!