通用函数参数通过默认实现影响返回类型

时间:2018-12-13 20:23:15

标签: typescript

给出以下(显然是简化的)功能

C:\Python27\Lib\site-packages\win32com\client>python LateAndEarly.py
True
0
0
0
Traceback (most recent call last):
  File "LateAndEarly.py", line 16, in <module>
    cs.GetDataAngular()
  File "C:\Python27\lib\site-packages\win32com\gen_py\35F923BD-6F0F-477D-A07C-E3
3C53FB692Bx0x3x0.py", line 415, in GetDataAngular
    return self._ApplyTypes_(1610809374, 1, (12, 0), (), u'GetDataAngular', None
,)
  File "C:\Python27\lib\site-packages\win32com\client\__init__.py", line 467, in
 _ApplyTypes_
    self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args),
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, u'PRICS681', u'Su
bscript out of range', None, 1000009, -2146828279), None)

有没有办法在Typescript中正确表达这一点? 我尝试了大约一百万种东西,但无法正常工作。

添加无操作默认转换也可以使我正常工作。但是我总是以if($count == 0) { $output .= '<div class="carousel-item active">'; } else { $output .= '<div class="carousel-item">'; } 结尾(假设T是转换和函数的返回类型)。

1 个答案:

答案 0 :(得分:1)

您可以使用overloadsconditional types进行此操作。不同数量的参数似乎可以更好地处理重载,如下所示:

function maybeTransform(): "abc";
function maybeTransform<R>(transform: (arg: string)=>R): R;
function maybeTransform(transform?: (arg: string)=>any) {
  const myString = "abc";
  return transform ? transform(myString) : myString;
}
const x = maybeTransform(); // "abc"
const y = maybeTransform((x: string) => x.length); // number

您也可以尝试使用条件类型,但由于参数的undefined-性质,它变得很时髦:

function maybeTransform<F extends undefined | ((arg: string) => any) = undefined>(
  transform?: F
): F extends (arg: string) => infer R ? R : "abc" {
  const myString = "abc";
  return transform ? transform(myString) : myString;
}
const x = maybeTransform(); // "abc"
const y = maybeTransform((x: string) => x.length); // number

这两种方法都无法很好地处理其类型可能不确定的参数:

const whoKnows = Math.random()<0.5 ? undefined : ((x: string)=>x.length);
const xOrY = maybeTransform(whoKnows);

带有重载,它不会编译(type '((x: string) => number) | undefined' is not assignable to parameter of type '(arg: string) => number');如果使用条件类型,则会给出错误的结果类型(number)。因此有一些警告。我想在这种情况下我更喜欢重载,因为我宁愿被阻止进行有效的调用然后被赋予无效的返回类型。

希望有所帮助;祝你好运!