我想要一个需要类型参数的函数:
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') 会导致错误,因为我没有提供类型 - 如何使类型成为必需的或以其他方式完成我在这里尝试做的事情,即确保一个字符串我将存在作为提供类型的属性传递?
这可能吗?
我尝试了
foo('abc');
function foo<{
abc: any;
}>(key: "abc"): "abc"
答案 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!!