我试图约束泛型函数的返回类型。(为了简化示例,请忽略函数的实际“有用性”)。
type MyReturnType<T> = T extends string ? number : Function;
type Input = string | number;
function myFn<T extends string | number>(input: T): MyReturnType<T> {
return typeof input === 'string' ? 100 : (() => {});
}
但是返回语句会导致打字错误-
Type '100 | (() => void)' is not assignable to type 'MyReturnType<T>'.
Type '100' is not assignable to type 'MyReturnType<T>'.
-这让我很困惑。在我的理解中,MyResnType
我觉得答案可能在条件类型的文档中,但我找不到它(老实说,这里文档的某些部分有点超出我的理解)。有人能给我解释一下这段话是怎么回事吗?
(TS 3.8.3)
这里的实际工作解决方案是使用重载:
type Input = string | number;
function myFn(input: string): number
function myFn(input: number): Function
function myFn(input: Input): number | Function {
return typeof input === "string" ? 100 : () => {}
}
只要确保你写了一个来涵盖每一种输入类型的可能性。在我的例子中,我的论点有5种可能的类型(包括2种联合),我必须这样写:
type Value = string | number | null
export function divBy10toPow(value: string, power: number): number
export function divBy10toPow(value: null, power: number): null
export function divBy10toPow(value: number, power: number): number
export function divBy10toPow<T extends number | null>(value: T, power: number): T
export function divBy10toPow<T extends string | null>(value: T, power: number): T extends string ? number : null
export function divBy10toPow(value: Value, power: number): Value {
return value === null
? null
: BigNumber(value)
.div(10 ** power)
.toNumber()
}
您必须说明string|null
和number|null
的特定联合,否则它将无法正确键入返回值。
类似于将类型缩小到联合类型的编译器限制:
类型true不能分配给类型T2扩展键T1?true: false'#22735
我正在尝试创建一个通用函数,它接受一个,并返回一个对象,该对象包含公共基类型的属性以及特定类型的默认值。出于某种原因,如果没有编译器的抱怨,我无法让它工作。我不确定问题出在哪里,但是 我怀疑这可能是将类型定义为条件类型的方式。我尝试过以各种方式重新定义我的类型,但没有成功,所以我怀疑我要么错过了一些明显的东西,要么没有类型断言是不可能的。 以下是我的类型: 以下是我的通用函数: 产生以下错误: 类
我有一个现有的C#泛型类,希望根据使用的类型添加或删除一个方法,我解释道 对于特定的
我正在尝试一个非常基本(人为)的条件类型函数,但遇到了意外错误: 我认为这是一个非常简单的条件类型用法,所以不确定发生了什么。有什么想法吗?
如何为动态创建的函数声明泛型类型? 我如何在中使用并传递? < code>useFoo的预期用法
我试图编写一个函数来返回
我不想为每个类型T编写这个方法只是为了调用getMessage()并将其传递给下一个方法。 有可能写出这样的方法吗?我只想访问ConstraintViolation接口的方法,这些方法不依赖于类型T(如字符串getMessage())。