验证后将类型更改为非null

时间:2017-08-29 15:55:28

标签: typescript

假设我有以下代码

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

3 个答案:

答案 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!