TypeScript类型缩小了objecct属性?

时间:2019-09-15 21:04:39

标签: typescript

无法编译:

type QueryParamValue = string | number | boolean | null | undefined;

function encodeParam(x: QueryParamValue) {
    if (x === true) {
        return '1';
    }
    if (x === false) {
        return '0';
    }
    if (x === undefined || x === null) {
        return '';
    }
    return encodeURIComponent(x);
}

interface QueryParams {
    [_: string]: QueryParamValue|QueryParamValue[];
}

export function queryParams(params: QueryParams) {
    return Object.keys(params)
        .map(k => {
            if(params[k] === undefined) {
                return undefined;
            }
            if (Array.isArray(params[k])) {
                return params[k]
                    .map(val => `${encodeParam(k)}[]=${encodeParam(val)}`)
                    .join('&')
            }
            return `${encodeParam(k)}=${encodeParam(params[k])}`
        })
        .filter(Boolean)
        .join('&');
}

codeplay

我想出了如果我将prop分配给一个中间值,那么它可以正常工作:

export function queryParams(params: QueryParams) {
    return Object.keys(params)
        .map(k => {
            const value = params[k]; // <-- assign to intermediate value
            if(value === undefined) {
                return undefined;
            }
            if (Array.isArray(value)) {
                return value
                    .map(val => `${encodeParam(k)}[]=${encodeParam(val)}`)
                    .join('&')
            }
            return `${encodeParam(k)}=${encodeParam(value)}`
        })
        .filter(Boolean)
        .join('&');
}

但是这种行为似乎并不直观。有什么方法可以编译第一个示例?

1 个答案:

答案 0 :(得分:1)

否,您需要变量:

TypeScript不能假设param[k]每次都会返回相同的值,因为

  • 有人可能同时更改了值
  • 属性访问可能实际上会调用一个随机返回不同值的getter