strictNullChecks导致错误:泛型类型不存在hasOwnProperty

时间:2019-08-03 08:21:13

标签: typescript

没有--strictNullChecks,我的代码就可以很好地工作。

启用--strictNullChecks时,发生以下错误:

类型“ T1”上不存在属性“ hasOwnProperty”。
属性“ hasOwnProperty”在类型“ T2”上不存在。

function extend<T1, T2>(arg1: T1, arg2: T2): T1 & T2 {
    const result: Partial<T1 & T2> = {};
    for (const prop in arg1) {
        if (arg1.hasOwnProperty(prop)) { // error when using --strictNullChecks
            (result as T1)[prop] = arg1[prop];
        }
    }
    for (const prop in arg2) {
        if (arg2.hasOwnProperty(prop)) { // error when using --strictNullChecks
            (result as T2)[prop] = arg2[prop];
        }
    }
    return result as T1 & T2;
}

3 个答案:

答案 0 :(得分:2)

由于它们是不受限制的泛型,因此T1或T2可以是nullequals(),而两者都没有false

您需要将它们标记为扩展对象:

null

答案 1 :(得分:0)

您可以找到关于主题here的更多信息,但是基本上Typescript并不知道您的泛型类型是Object。

正确地假设它可以是任何东西,包括字符串,数字甚至是null。因此,允许您在这些电话上调用hasOwnProperty毫无意义。

您需要指定更多的泛型类型。

function extend<T1 extends object, T2 extends object>(arg1: T1, arg2: T2): T1 & T2;

答案 2 :(得分:0)

.hasOwnProperty是对象的属性,泛型不知道。您可以使用T1 extends {}来继承这些类型

function extend<T1 extends {}, T2 extends {}>(arg1: T1, arg2: T2): T1 & T2 {
    const result: Partial<T1 & T2> = {};
    for (const prop in arg1) {
        if (arg1.hasOwnProperty(prop)) { // error when using --strictNullChecks
            (result as T1)[prop] = arg1[prop];
        }
    }
    for (const prop in arg2) {
        if (arg2.hasOwnProperty(prop)) { // error when using --strictNullChecks
            (result as T2)[prop] = arg2[prop];
        }
    }
    return result as T1 & T2;
}