我正在构建一个名为unique
.
它的作用是从数组或字符串中删除所有重复项,因此它具有function overloading
.
请参阅此问题代码示例:
function unique(str: string): string[];
function unique<T>(arr: T[]): T[];
/**
* Create an `array` without duplicates.
*/
function unique<T>(arrOrString: string | T[]): string[] | T[] {
return [...new Set(arrOrString)]; // typescript will yell at me at this line.
}
export default unique;
但是,如果我将代码更改为 if-else 但实际上什么都不做,打字稿现在可以满足:
// same code, but actually compiling.
function unique(str: string): string[];
function unique<T>(arr: T[]): T[];
/**
* Create an `array` without duplicates.
*/
function unique<T>(arrOrString: string | T[]): string[] | T[] {
if (typeof arrOrString === 'string') {
return [...new Set(arrOrString)];
} else {
return [...new Set(arrOrString)];
}
}
export default unique;
为什么会这样?我必须写[...new Set(arrOrString)]
两次才能使它工作吗?
这是因为Set()
构造函数不能接受 type string | T[]
。
这实际上是一件好事。
您的代码服务于两种情况:当输入是string
或它是T[]
.
使用函数重载可以使您的代码更易于使用:
function unique<T>(arrOrString: string): string[]
function unique<T>(arrOrString: T[]): T[]
function unique<T>(arrOrString: any): any {
return [...new Set(arrOrString)];
}
const y = unique('x') // y is string[]
const p = unique([1, 2, 3]) // p is number[]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句