我想把一个‘泛型’函数作为参数传递给一个函数,而不是在那个时候‘专门化’该函数.类似于:

type F<T> = (p: T) => void

function report(f: F) {
  f<A>({ a: 1 })
  f<B>({ b: "foo" })
}
// with
type A = { a: number }
type B = { b: string }

这显然行不通.我想知道我在这里需要的是不是与https://github.com/Microsoft/TypeScript/issues/1213有关?

想要这样做的原因是为了确保WAW将被传递到f个IS 确实是所提供的特定类型的.该函数本身并不真正关心.实际上, 在我的实际用例中,AB都将扩展相同的类型(只有第f部分需要).

我目前的解决方法是使用一个界面:

interface I {
  f<T>(p: T): void
}

function report2(i: I): void {
  i.f<A>({ a: 1 })
  i.f<B>({ b: "foo" })
}

或帮助器函数:

function ensure<T>(arg: T): T {
  return arg
}

function report3(f: (arg: any) => void): void {
  f(ensure<A>({ a: 1 }))
  f(ensure<B>({ b: "foo" }))
}

有没有更直接的方法来说明这一点?

推荐答案

你会用generic function代替generic type

比较一般功能:

type F = <T>(p: T) => void

//equivalent to:
interface FInterface {
  <T>(arg: T): void;
}

使用泛型类型

type F<T> = (p: T) => void

// equivalent to
interface FInterface<T> {
  (arg: T): void;
}

在第一种情况下,我们有一个泛型函数,在第二种情况下,我们有一个非泛型函数作为泛型接口的一部分

请参阅:typescript difference between placement of generics arguments

Generic fuction 泛型函数在函数的调用签名上声明其泛型类型参数(或参数):

type IdentityGenFunc = <T>(t: T) => T

泛型函数(上面的T)上的类型参数直到函数被实际调用时才被指定,此时调用者指定它(或者编译器代表调用者推断它).这意味着泛型函数实现必须能够处理函数调用者想要的任何可能的T规范

参见:Generic Types

在A和B扩展相同类型的情况下,可以将F的参数限制为该基类型:

type F = <T extends Base>(p: T) => void

整个示例:

type Base = {id: number}
type A = { a: number } & Base
type B = { b: string } & Base


type F = <T extends Base>(p: T) => void

function report(f: F) {
  f<A>({ id: 1, a: 1 })
  f<B>({ id: 2, b: "foo" })
}

function ff(p: Base) {
  console.log(p);
}

report(ff);

Typescript相关问答推荐

"@ clerker/nextjs/server没有名为clerkMiddleware的导入成员'

React组件数组及其props 的类型定义

TypScript在对象上强制执行值类型时推断对象文字类型?

如果请求是流,如何等待所有响应块(Axios)

根据类型脚本中的泛型属性 Select 类型

打字错误推断

从非文字数组(object.keys和array.map)派生联合类型

在TypeScript中扩展重载方法时出现问题

TypeScrip:使用Union ToInterval辅助对象,但保留子表达式

类型脚本-在调用期间解析函数参数类型

将类型脚本函数返回类型提取到VSCode中的接口

为什么数字是`{[key:string]:UNKNOWN;}`的有效密钥?

如何从JWT Reaction中提取特定值

窄SomeType与SomeType[]

Vite+Chrome扩展 list v3-;不能在模块外使用import语句;对于inpage脚本

在ts中获取级联子K类型?

断言同级为true或抛出错误的Typescript函数

如何通过nx找到所有受影响的项目?

将对象数组传递给 Typescript 中的导入函数

通用可选函数参数返回类型