2017-05-14 100 views
1

在google闭包编译器中,您可以通过执行typeof或instanceof来优化泛型。 例如,下面我带一个通用的,把它当作一个对象:在typescript中精炼泛型类型

/** 
* @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 
} 

我试着在打字稿实现这一点,但我不能把它当作一个对象。

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; 
} 
+0

您是否尝试添加演员?像'{... obj}'。这与“Object.assign”的效果不一样吗? –

+0

@ A.Akram演员仍然失败'Type'{}'不能分配给'T'类型。' 你说得对,'Object.assign'和spread是一样的。我认为'Object.assign({},obj)'有效,但我很好奇为什么传播不起作用。 – Kamran224

+0

不使用泛型类型参数的泛型函数,很棒 – Dummy

回答

2

不能使用typeof为你正在尝试做的事:

这些typeof运算型后卫被认为在两种不同的形式:typeof运算 v === “类型名称” 和typeof运算V = =“typename”,其中“typename”必须是 “number”,“string”,“boolean”或“symbol”。虽然TypeScript不会 阻止您与其他字符串进行比较,但语言不会将这些表达式识别为类型警卫。

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