[英]Typescript autocomplete for return type of function
我正在尝试创建一个简单的 function,它将按键返回 object 的值,如果它是 function,它将执行它并返回正确的类型,因此它可以由代码编辑器自动完成。
type defaults = {
a: "A" | "B" | (() => "A" | "B");
b: "X" | "Y" | (() => "X" | "Y");
};
const myOpts: defaults = {
a: () => "A",
b: () => "X",
};
function option(name: string) {
if (!myOpts[name]) {
return null;
}
return typeof myOpts[name] === "function"
? myOpts[name].call()
: myOpts[name];
}
console.log(myOpts.a); // Autocomplete works
console.log(option("a")); // Autocomplete does not work at all
console.log(option("xyz")); // Should warn that it does not exist!!!
那么,是否可以判断出 function 的返回类型是在某些 object 中通过 key 找到的值的类型。
所以,我假设你只想自动完成任何可以从类型中推导出来的东西,在这种情况下,你可以只使用keyof 运算符
在您的场景中,您会将option
function 更改为:
function option(name: keyof defaults): 'A' |'B' | 'X' | 'Y' | null {
const prop = myOpts[name];
if (!prop) {
return null;
}
if (typeof prop === 'function') {
return prop();
}
return prop;
}
如果您尝试使用未知密钥作为参数,这会给您一个警告。
现在需要的最后一个更改是更改潜在的 function 的调用方式。 您也可以在这里使用prop.call( null )
,但为什么不直接调用它(如果您确定它是之前检查过的 function )
你可以在这里的操场上试试
作为评论,基于类型推断,当前的 function 实际上不会return null;
现在在任何地方(它将始终是任何不可为空的属性)但我添加了 null function 结果而不必更改大部分代码:)
更改代码的另一种选择是使用一些更通用的选项,例如:
function option<T>( source: T, name: keyof T): any {
const prop = source[name];
if (!prop) {
return null;
}
if (typeof prop === 'function') {
return prop();
}
return prop;
}
这仍然会给你验证,但结果类型可能需要是 any ,或者 string 如果你总是打算从它返回字符串值
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.