我正在寻找与Typescript泛型类似的专业知识,在这些泛型中,根据类型标准可以将实现分离。
一个最小的例子:
const someFunction = <A>() => { return 0; }
// something like this
<A extends String>someFunction = (a: A) => { return 1; }
<A extends Number>someFunction = (a: A) => { return 2; }
.
.
.
console.log(someFunction(false)); // prints 0
console.log(someFunction('string')); // prints 1
console.log(someFunction(42)); // prints 2
这是我想要的“剑”。在Typescript中可以吗?
答案 0 :(得分:0)
您所谈论的内容在Typescript中不存在。与此最接近的是function overload。根据您的示例,它看起来像这样:
function someFunction(a: boolean): 0
function someFunction(a: string): 1
function someFunction(a: number): 2
function someFunction(a: any) {
if(typeof a === 'boolean') {
return 0
} else if (typeof a === 'string') {
return 1
} else if (typeof a === 'number') {
return 2
}
}
此示例适用于原语和typeof
,但适用于复杂值和其他type guards包括用户定义的类型防护。
答案 1 :(得分:0)
TypeScript 中还有一个有趣的特性叫做“类型保护”:
export function isString(value: any): value is string {
return typeof value === 'string' || value instanceof String;
}
使用这样定义的函数,您可以创建如下表达式:
function validate(value: string|string[]): string|void {
if (isString(value) && value.replace(/\s+|\s+/g, '') === '')) {
return this.msg;
}
}
请注意,该方法 replace
在类型 string[]
中不存在,因此如果我只是使用函数重载,编译器会引发错误。