TypeScript Lint WebStorm: Тип параметра обратного вызова - PullRequest
0 голосов
/ 28 июня 2018

Надеюсь, кто-нибудь может мне помочь, у меня небольшая проблема, пытаясь выяснить, как заставить TypeScript Lint WebStorm обрабатывать определенные данные обратного вызова, что не является обязательным.

У меня есть функция, которую я экспортирую:

test(callback: (data: string) => void) {
    callback('Hello from Index');
}

И используя его:

TestClass.test(() => {
      console.log(`This is data from Tester: ${}`); 
})

Но средство проверки TypeScript не обнаруживает, что я не набираю аргумент, который не является обязательным. Параметр обратного вызова был специально установлен в функции;

callback: (data: string)

Моя главная цель здесь состоит в том, чтобы заставить каждую функцию, у которой нет необязательных аргументов, как минимум набрать аргументы (необязательно использовать точное имя в экспортируемой функции, но иметь его как обязательное, как таковое:

TestClass.test((result) => {
      console.log(This is data from Tester: ${}); 
})

Заранее спасибо!

1 Ответ

0 голосов
/ 28 июня 2018

Это по замыслу. Если у вас есть параметр обратного вызова, который будет принимать параметры, но реализация обратного вызова не использует параметры, это не проблема, параметры просто игнорируются.

Мы можем сделать некоторую «умную» условную типизацию, чтобы заставить компилятор выдавать ошибку, если не указан параметр:

type IsValidArg<T> = T extends object ? keyof T extends never ? false : true : true;
type HasArgument<T, TError> =  (T extends (arg: infer U)=> void ? IsValidArg<U> extends true ? {} : TError :TError )

class TestClass {
    static test<T extends (data: string) => void>(callback: T & HasArgument<T, "You need to have an argument to the implementation">): void
    static test(callback: (data: string) => void) {
        callback('Hello from Index');
    }
}

//OK
TestClass.test((data) => {
    console.log(`This is data from Tester: ${data}`);
})
//Type '() => void' is not assignable to type '"You need to have an argument to the implementation"'.
TestClass.test(() => {
    console.log(`This is data from Tester: ${0}`);
})

Сообщение об ошибке не является идеальным, но достаточно явным.

Вы также можете заставить вызывающего сделать что-то с параметром, используя "noUnusedParameters": true в tsconfig.json

...