【发布时间】:2021-07-08 14:40:27
【问题描述】:
我正在尝试根据联合类型中特定的可选布尔属性的值来推断另一个函数属性的类型。
很难用句子解释,所以请看下面的代码和cmets:
interface SingleCallback<T> {
func: (arg: T) => T;
value: T;
multiple?: false | undefined;
}
interface MultiCallback<T> {
func: (arg: T[]) => T[];
value: T[];
multiple: true;
}
type Callback<T> = SingleCallback<T> | MultiCallback<T>;
const mult: Callback<number> = {
value: [1, 2, 3],//OK
func: (arg) => [...arg, 1, 2, 3],//OK. The arg is number[]
multiple: true
};
const singleOk: Callback<number> = {
value: 1,//OK
func: (arg) => arg + 1,//OK. The arg is number
multiple: false
};
const singleNotOk: Callback<number> = {
value: 1,//OK
func: (arg) => arg + 1,//Not OK. I want to make arg be inferred as a number, but it is not.
};
如果明确指定了“多个”,这将很有效。当我没有定义“多个”值时,就会出现问题。对一般属性还是可以的,但是只对函数属性的参数,不能推断类型,会报错。
这是什么原因?你能给我一些解决这个问题的想法吗?
【问题讨论】:
-
你使用的是什么版本的 TypeScript?我在 TypeScript Playground 中尝试了最新版本,它似乎可以工作。
-
感谢您的提示。我用的是4.3.0,这个问题好像已经在4.3.5版本解决了。
-
catchts.com/callbacks 在这里你可以找到几个关于输入回调的例子
标签: typescript boolean type-inference union-types