打字稿必需的函数类型参数

时间:2021-02-09 17:59:26

标签: typescript

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

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"

2 个答案:

答案 0 :(得分:1)

尝试使用默认为 keyof T 的第二个泛型类型:

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

答案 1 :(得分:0)

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

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!!
相关问题