Javascript 在typescript中优化泛型类型
在google闭包编译器中,您可以通过执行typeof或instanceof来细化泛型。 例如,这里我使用泛型并将其视为对象: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
/**
* @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你能澄清一下吗?我是新手,你可能想看看这个