打字稿:带有可选参数的重载:“重载签名与函数实现不兼容。”

时间:2018-11-04 10:12:34

标签: typescript override

我一直在尝试重载(起初试图在打字稿中实现this basic proxy example,而没有犯规之类的技巧,例如禁用一行中的类型检查,如果你们中的任何人解决了随意破坏我的事情,我已经知道太多,而且我似乎无法解决它也很烦人。)

我在进行实验时遇到了问题。这是我的代码:

language: php
sudo: required
dist: trusty

php: 
  - 7.1
  - 7.2

addons:
  chrome: stable

services:
  - mysql

install:
  - cp .env.travis .env
  - mysql -e 'create database homestead_test;'
  - travis_retry composer self-update
  - travis_retry composer install --no-interaction
  - php artisan key:generate
  - php artisan migrate:fresh --seed

before_script:
  - google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://localhost &
  - php artisan serve &

script:
  - php artisan code:analyse --level=7
  - php artisan dusk
  - vendor/bin/phpunit

notifications:
  email: false

我必须在实现上添加// "Overload signature is not compatible with function implementation." on first (in code) declaration function strOrObj (samePar:object, obj:object):object|undefined; function strOrObj (samePar:object, num:number):number|undefined; function strOrObj (samePar:object, num?:number, obj?:object):object|number|undefined{ console.log("obj="+obj, "num="+num); return obj? obj: num; } ,因为编译器在查看实现时认为可能需要这样做。它并没有要求我将其添加到替代项中,但是无论如何我还是做了一些实验。但是,当我在实现中添加类型声明时,会出现错误undefined

我要编译的唯一方法是将实现声明中的任何参数声明为Overload signature is not compatible with function implementation.,但是那样会将所有给定类型填充到第一个可选参数(any中这种情况)。

问题是,这里出了什么问题?如果您不确定将使用第一个参数,是否甚至可能具有多个可选参数?或者这可能是问题所在(可能是由于JS实现引起的)?

很抱歉,如果重复的话,我发现唯一适用的事情是Github上的一个问题,但修复了seem to have been merged into the release code

2 个答案:

答案 0 :(得分:1)

Typescript允许您定义多个重载,但这是您在进行区分时的工作,这就是为什么强制性签名必须与所有重载兼容的原因

function strOrObj (samePar:object, obj:object):object|undefined;
function strOrObj (samePar:object, num:number):number|undefined;
function strOrObj (samePar:object, numObj:number| object):object|number|undefined{
    if (typeof numObj === 'number') {
        return samePar
    } else {
        numObj
    }
}

答案 1 :(得分:0)

@ titian-cernicova-dragomir在他的回答的评论中回答了我的实际回答。在这里,我写下了他的回答和自己的测试得出的结论。

Typescript不允许根据给定参数的类型来选择给定参数的名称(而无需自己明确编写类型检查)。 Typescript(至少到目前为止)中唯一的逻辑重载实现是检查重载是否适合输入和返回类型中的实现,并选择合适的替代来确定返回类型。

可选变量只是从右到左填充,而不管给定类型。多数民众赞成在导致错误的原因,因为即使是辅助对象参数(“ obj”)也将最终落在实现中的num变量中,并且编译器抱怨第二个参数永远不会是数字,因此重载签名无效。

您可以通过切换参数来进行测试,如果您首先在实现中定义obj,它将抱怨第二重载签名,因为第二参数将始终是对象。