Использование определенных функций в качестве параметров в TypeScript - PullRequest
0 голосов
/ 09 апреля 2019

Есть ли способ иметь функцию, которая принимает только определенные функции в качестве параметров?

Это то, что я хочу сделать:

function foo(str: string): string
function bar(str: string): string

function baz(f: foo | bar): any

Я знаю, что мог бы сделать это: function baz(f: (string) => string): any, но это не совсем то, что я ищу здесь.Кроме того, у меня нет цели для этого вопроса, просто спросить из любопытства.

1 Ответ

1 голос
/ 09 апреля 2019

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

function foo(str: string): string { return ""}
function baz(f: typeof foo): any {}

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

Вы можете сделать что-то, используя специально созданные фирменные типы:

function createBrandedFunction<T, B extends new(...a: any[]) => any>(fn: T, brand: ()=> B) : T & { __brand: B } {
    return fn as any
}


const foo = createBrandedFunction(
    function (str: string): string { return ""}, 
    ()=> class { private p: any}) // we just use a class with a private field to make sure the brand is incompatible with anything else

const bar = createBrandedFunction(
    function (str: string): string { return ""}, 
    ()=> class { private p: any}) // even a class with the same private is not compatible

function baz(f: typeof foo): any {}
baz(foo) // ok
baz(bar) // err
baz((s)=> "") // err
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...