我正在尝试使用typescript 2.8的新conditional types,(尚未发布的版本2.8.0-dev.20180307),我不知道这是一个错误还是仅仅是误用。我的重点是我的MockedImplementation<F>
声明,它可以是匹配F
的完整函数,F
的返回类型,以及F
的返回类型是{{} 1}},然后它也可能是承诺解决的 - 所有要由Promise
相应地包装。
mockIt()
type MockedImplementation<F> =
F | // The function signature
((ReturnType<F extends (...args: any[]) => any ? F : any>) extends infer T
? T extends Promise<infer R>
? (T | R) // Or the promise or just the type that the promise resolves to
: T // or whatever type this is
: never);
interface Wrapped<T> {
result: T
}
function mockIt<F>(pretend : MockedImplementation<F>) : F {
throw new Error('Not Implemented'); // doesn't matter
}
interface SomeOperationA {
(parameters : { 'a': number[], 'b'?: string }) : Promise<string>;
}
mockIt<SomeOperationA>(() => Promise.resolve('hello')); // OK
mockIt<SomeOperationA>(Promise.resolve('hello')); // OK
mockIt<SomeOperationA>('hello'); // OK
mockIt<SomeOperationA>(42); // Type error.
的{p> mockIt
可能正常工作,可能是因为没有函数签名覆盖。但SomeOperationA
的{{1}}失败了:
mockIt
它似乎是交叉类型而不是联合它们?但我确信它比那更微妙。
我在某个地方看到了一个关于“考虑最后一次超载的说明,因为它可能是最普遍的”,但我不认为它在这里是相关的,因为它看起来似乎没那么重要。
@jcalz是对的,有道理:
SomeOperationB
答案 0 :(得分:3)
没有条件类型的问题的较小复制:
select new {
很明显,TypeScript不认为箭头函数与}
兼容,因为它无法满足其中一个重载签名。实际上,如果您将FULL OUTER JOIN
作为第二个参数传递给该函数,则不将返回if ( $the_service->have_posts() ) :
$output .= '
<div class="single-sidebar-widget">
<div class="special-links">';
$output .= '<ul class="nav nav-tabs single-services-menu" role="tablist">
<li><a href="http://example.com/all-services/">All Services</a>
</li>
while ( $the_service->have_posts() ) : $the_service->the_post(); $count++; if ( 0 == $post->post_parent ) { $args1 = array( 'post_type' => 'services', 'post_status' => 'publish', 'post_parent' => get_the_ID(), 'order' => esc_attr($order) );
if($varPageID == get_the_ID())
$varClass = 'class=active';
else
$varClass = '';
$output .= '<li role="presentation" '.esc_attr($varClass).'><a href="'.get_permalink().'">'.get_the_title().'</a>
</li>';
}
endwhile;
$output .= '
</ul></div></div>';
else:
$output .= esc_html( 'Sorry, there is no services under your selected page.', 'plumbing' );
endif;
wp_reset_postdata();
echo $output;
?>
,这是declare function acceptSomeOperationB(x: SomeOperationB): void;
acceptSomeOperationB(() => Promise.resolve('hello')); // ❌ Type 'string' is not assignable to type 'Wrapped<string>'.
的第二个签名所要求的。
一旦你决定如何解决它,它应该开始工作(或者你至少可以继续处理条件类型的问题。)
祝你好运。