【问题标题】:Typescript required function type argument打字稿所需的函数类型参数
【发布时间】:2021-07-28 01:34:39
【问题描述】:

我想要一个需要类型参数的函数:

function foo<T>(key: keyof T): keyof T {
  return key;
}

foo<TypeWithoutAbc>('abc') // error
foo<TypeWithAbc>('abc') // no error
foo('abc'); // no error - why not?!

我希望 foo('abc') 会导致错误,因为我没有提供类型 - 我怎样才能使类型成为必需或以其他方式完成我在这里尝试做的事情,即确保一个字符串我通过作为提供类型的属性存在?

这可能吗?

我试过 但它不起作用,相反它几乎假定函数参数正在确定类型 T 并且当我将鼠标悬停 foo('abc') 时我得到了这个

foo('abc');

function foo<{
    abc: any;
}>(key: "abc"): "abc"

【问题讨论】:

  • 对无法实现的泛型使用默认值,例如&lt;T = never&gt;
  • @IngoBürk 我试过了,它也不起作用
  • 我相信这会回答你的问题stackoverflow.com/a/57744230/3857837
  • @Yuval 谢谢,但我无法在我的情况下使用它。我的函数使用一个参数,其类型是类型参数的“keyof”。我尝试了很多不同的方法,但无法弄清楚。

标签: typescript


【解决方案1】:

尝试使用第二种泛型类型,默认为keyof T

function foo<T, S extends keyof T = keyof T>(key: S): S {
  return key;
}

【讨论】:

  • 啊,谢谢 - 这确实会产生预期的结果! foo('abc') // 错误 foo('abc') // 没有错误 foo('abc') // 错误 - 不错!需要注意的是,我失去了来自 vscode 的提示,即提示可接受的参数值,这是我使用类解决方案获得的。
  • 类解决方案的警告是,您使用的是类而不是函数;)
  • 是的,没错!
【解决方案2】:

我发现获得这种行为的唯一方法是使用类而不是函数。

class TypeChecker<T> {
  foo(key: keyof T & string) {
    return key as string;
  }
}

new TypeChecker<TypeWithoutAbc>().foo('abc') // error
new TypeChecker<TypeWithAbc>().foo('abc') // no error
new TypeChecker().foo('abc') // error - nice!!

【讨论】:

    猜你喜欢
    • 2019-03-20
    • 2022-01-12
    • 2022-11-11
    • 2020-12-28
    • 2019-07-05
    • 2020-03-22
    • 2018-05-02
    • 2016-08-26
    • 2021-10-27
    相关资源
    最近更新 更多