Как я могу сказать TypeScript, что мое свойство может быть логическим ИЛИ функцией с определенной сигнатурой c? - PullRequest
1 голос
/ 10 июля 2020

Рассмотрим следующую строку в определении TypeScript:

interface MyOptions {          
     public highlightMatch?: (instance: MyInstance, rendered: JQuery<HTMLElement>) => void;
}

Исходя из этого, TypeScript знает, что для моего свойства highlightMatch я ожидаю функцию с данной подписью, которая ничего не вернет. Как я могу сказать TypeScript, что это же свойство также может быть значением boolean?

Я пробовал это, но это не работает:

public highlightMatch?: boolean | (instance: MyInstance, rendered: JQuery<HTMLElement>) => void;

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Я бы не рекомендовал это делать. Вы будете делать много проверок, чтобы узнать, относится ли ваша собственность к тому или иному типу.

interface MyInstance {
    x : any
}

type SomeFunction = (instance: MyInstance, rendered: JQuery<HTMLElement>) => void;
type BooleanOrFunction = boolean | SomeFunction

interface MyOptions {          
    highlightMatch: BooleanOrFunction;
}

const myOptionsWithBoolean: MyOptions = {
    highlightMatch: true,
}

const myOptionsWithFunction: MyOptions = {
    highlightMatch: (instance: MyInstance, rendered: JQuery<HTMLElement>) => {
        return void 0;
    },
}

myOptionsWithFunction.highlightMatch; // Typescript has No idea what this is 

if (myOptionsWithFunction.highlightMatch && typeof myOptionsWithFunction.highlightMatch !== 'boolean') {
    myOptionsWithFunction.highlightMatch(x as any, y as any);
} else {
    myOptionsWithFunction.highlightMatch // Here this is a boolean
}

Ссылка на площадку

Моя рекомендация? Сделайте это с помощью Generics

interface MyInstance {
    x : any
}

type SomeFunction = (instance: MyInstance, rendered: JQuery<HTMLElement>) => void;
type HighlightMatch = boolean | SomeFunction

interface MyOptions<T> {          
    highlightMatch: T;
}

const myOptionsWithBoolean: MyOptions<boolean> = {
    highlightMatch: true,
}

const myOptionsWithFunction: MyOptions<SomeFunction> = {
    highlightMatch: (instance: MyInstance, rendered: JQuery<HTMLElement>) => {
        return void 0;
    },
}

myOptionsWithFunction.highlightMatch; // This is a function Thanks Generic! 
myOptionsWithBoolean.highlightMatch; // This is boolean!

Ссылка на игровую площадку

0 голосов
/ 10 июля 2020

Как предлагает @VLAZ, вы можете окружить подпись метода парентезом или, чтобы сохранить его более чистым, вы можете определить собственный тип.

Таким образом, если вам нужно назначить подпись метода для некоторого var, это будет проще и понятнее:

type MyFunction = (instance: MyInstance, rendered: JQuery<HTMLElement>) => void;
interface MyOptions {          
 public highlightMatch?: boolean | MyFunction;
}

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

let myVar: MyFunction;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...