typescript 不扩展属性类型我不关心约束

btxsgosb  于 2022-12-27  发布在  TypeScript
关注(0)|答案(1)|浏览(105)

我有一个接口:

interface I {
  // Question: I only really care about constraining the input parameters
  fn: (s: string) => any
  val: any
}

我使用此接口的目的只是要Assert

  • val,我不关心约束它的类型
  • 确保fn是一个接受string的函数,但我不关心约束返回类型

使用此选项的示例如下:

const noice = {
  fn: (s: string) => s.length,
  val: new Date()
}

const test1: I = noice

test1.fn  // (property) I.fn: (s: string) => any
test1.val // (property) I.val: any

noice.fn  // (property) fn: (s: string) => number
noice.val // (property) val: Date

有没有办法去掉any,这样我就有了和noice相同的test1的特定类型?
也许现在是satisfies,但是对于那些还没有升级和阅读“遗留”代码的人来说,4.9版本之前的版本呢?

wribegjk

wribegjk1#

如果你使用的是typescript〉= 4.9并且你可以使用satisfies操作符,你可以:

const x = noice satisfies I

否则,您可以执行如下解决方法:

function enforce<Constraint>() : <T extends Constraint>(t: T) => T {
    return <T>(t: T) => t
}

这里使用了currying,所以你不需要指定其他类型的参数。首先,你调用第一个带有你想要的约束的函数,然后调用第二个函数,它将返回相同的参数。这显然有一些小的运行时开销。

const result = enforce<I>()(noice)

相关问题