没有--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;
}
答案 0 :(得分:2)
由于它们是不受限制的泛型,因此T1或T2可以是null
或equals()
,而两者都没有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;
}