Typescript 具有无点函数的泛型类型

Typescript 具有无点函数的泛型类型,typescript,functional-programming,typescript-generics,pointfree,Typescript,Functional Programming,Typescript Generics,Pointfree,假设我有下一个功能: function cast<T>(v: any): T { return v as T; } 函数强制转换(v:any):T{ 返回v作为T; } 现在,我有了一个数组,我想使用map来投射它: const arr = [1, 3, 5]; // works arr.map(value => cast<number>(value)); // but I want arr.map(cast<number>); con

假设我有下一个功能:

function cast<T>(v: any): T {
    return v as T;
}
函数强制转换(v:any):T{
返回v作为T;
}
现在,我有了一个数组,我想使用map来投射它:

const arr = [1, 3, 5];

// works
arr.map(value => cast<number>(value));

// but I want
arr.map(cast<number>);
const arr=[1,3,5];
//工作
arr.map(值=>cast(值));
//但是我想要
arr.map(cast);

可能吗?我可以在无点映射上传递泛型吗?

由于
cast
不被视为数组映射所需的回调函数,因此您不可能想要什么

您可以通过在控制台中简单地记录函数来尝试查看函数是什么和不是什么

尝试
console.log(cast)

console.log(cast)

由于
cast
未被视为数组映射所需的回调函数,因此无法实现您想要的功能

您可以通过在控制台中简单地记录函数来尝试查看函数是什么和不是什么

尝试
console.log(cast)

console.log(cast)

实际上,来自阵列原型的
map
方法是通用的

Array<T>.map<U>(callback: (value: T, index: number, array: T[]) => U): U[]
这是一篇有趣的文章


几个月后,当我读到这篇文章时,另一个想法在我脑海中闪现。
另一种解决方案是使用函数包装器将类型参数显式传递给
cast
函数

type Fn<T> = (element: any) => T;

const cast = <T>(element: any): T => {
    return element as T;
}

const caster = <T>() => {
    return cast as Fn<T>;
}

const dut: any[] = [1, 2, 3, 4, 5, 6];
const casted = dut.map(caster<number>());

// casted is of type number[]
type Fn=(元素:any)=>T;
const cast=(元素:any):T=>{
返回元素为T;
}
常量caster=()=>{
返回铸造为Fn;
}
常量dut:any[]=[1,2,3,4,5,6];
常量casted=dut.map(caster());
//铸造的类型编号为[]
尽管主解决方案仍然是最好的,但这种方法可以解决某些情况,即目标API不提供任何重载来推断类型


希望有帮助。

实际上,数组原型中的方法
map
是通用的

Array<T>.map<U>(callback: (value: T, index: number, array: T[]) => U): U[]
这是一篇有趣的文章


几个月后,当我读到这篇文章时,另一个想法在我脑海中闪现。
另一种解决方案是使用函数包装器将类型参数显式传递给
cast
函数

type Fn<T> = (element: any) => T;

const cast = <T>(element: any): T => {
    return element as T;
}

const caster = <T>() => {
    return cast as Fn<T>;
}

const dut: any[] = [1, 2, 3, 4, 5, 6];
const casted = dut.map(caster<number>());

// casted is of type number[]
type Fn=(元素:any)=>T;
const cast=(元素:any):T=>{
返回元素为T;
}
常量caster=()=>{
返回铸造为Fn;
}
常量dut:any[]=[1,2,3,4,5,6];
常量casted=dut.map(caster());
//铸造的类型编号为[]
尽管主解决方案仍然是最好的,但这种方法可以解决某些情况,即目标API不提供任何重载来推断类型


希望有帮助。

使用无点样式的更多类型安全选项(运行时检查):

函数断言(expr:unknown,msg=”“):断言expr{if(!expr)抛出错误(msg);}
constevery=(cb:(t:unknown)=>t是t)=>(a:unknown[]):a是t[]=>arr.every(cb);
const isNumber=(mn:unknown):mn是number=>typeof mn==“number”
常量arr:未知[]=…//给定一些未知数组
断言(每个(isNumber)(arr));
arr//arr now的类型为number[](或已抛出,可由错误处理程序获取)

使用无点样式的更多类型安全替代方案(运行时检查):

函数断言(expr:unknown,msg=”“):断言expr{if(!expr)抛出错误(msg);}
constevery=(cb:(t:unknown)=>t是t)=>(a:unknown[]):a是t[]=>arr.every(cb);
const isNumber=(mn:unknown):mn是number=>typeof mn==“number”
常量arr:未知[]=…//给定一些未知数组
断言(每个(isNumber)(arr));
arr//arr now的类型为number[](或已抛出,可由错误处理程序获取)

你好,爸爸。我试过你的例子,但是第二个变体不起作用。我试过你的例子,但第二个变体不起作用。