Javascript 在typescript中优化泛型类型

Javascript 在typescript中优化泛型类型,javascript,typescript,google-closure-compiler,Javascript,Typescript,Google Closure Compiler,在google闭包编译器中,您可以通过执行typeof或instanceof来细化泛型。 例如,这里我使用泛型并将其视为对象: /** * @param {T} obj * @return {T} * @template T */ function cloneIfObject(obj) { if (typeof obj === 'object') { return objectClone(obj); } return obj; } /** * Stub funct

在google闭包编译器中,您可以通过执行typeof或instanceof来细化泛型。 例如,这里我使用泛型并将其视为对象:

/**
 * @param {T} obj
 * @return {T}
 * @template T
 */
function cloneIfObject(obj) {
  if (typeof obj === 'object') {
    return objectClone(obj);
  }
  return obj;
}

/**
 * Stub function that only accepts object type
 *
 * @param {!Object} obj
 * @return {!Object}
 */
function objectClone(obj) {
  return obj; //Pretend to clone
}
我尝试在typescript中实现它,但我无法将其视为对象

function cloneIfObject<T>(obj: T) {
    if (typeof obj === 'object') {
        return { ...obj }; //Error: Spread types may only be created from object types.
    }

    if (obj instanceof Object) {
        return { ...obj }; //Error: Spread types may only be created from object types.
    }

    return obj;
}
函数克隆对象(obj:T){
如果(对象的类型=='object'){
返回{…obj};//错误:只能从对象类型创建排列类型。
}
if(对象的obj实例){
返回{…obj};//错误:只能从对象类型创建排列类型。
}
返回obj;
}

您不能使用
typeof
来执行以下操作:

这些类型的防护装置有两种不同的形式:类型 v==“typename”和typeof v!==“typename”,其中“typename”必须为 “数字”、“字符串”、“布尔值”或“符号”。而打字脚本不会 阻止您与其他字符串进行比较,因为该语言无法识别 这些表达式被称为类型保护


第二个将是有效的使用,只要他们修复(已经有一个)。

您是否尝试添加强制转换?比如
{…obj}
。这不是与
Object.assign
?@A.Akram的效果相同吗?强制转换仍然失败
类型“{}”不能分配给类型“T”。
你说得对
Object.assign
与spread相同。我认为
Object.assign({},obj)
有效,但我很好奇为什么spread不起作用。一个不使用泛型类型参数的泛型函数,great@Dummy你能澄清一下吗?我是新手,你可能想看看这个