Обязательные и предполагаемые универсальные типы в TypeScript

Убедитесь, что модификатор доступа является общедоступным, а не закрытым. Я продолжаю эту проблему, и всегда это моя проблема.

public static void main (String [] args)

2
задан ducin 16 January 2019 в 21:42
поделиться

1 ответ

Они очень различаются по сигнатуре функции, которую они определяют.

  • Первый определяет сигнатуру обычной функции, которую можно настроить с помощью параметра типа при использовании, и этот тип становится фиксированным в сигнатуре
  • Второй определяет сигнатуру общей функции это функция, которая может принимать параметр любого типа T, причем T выводится (или указывается явно) при вызове функции.

Рассмотрим следующие объявления:

declare const fn: FnWithRequiredParam<number> 
declare const genericFn: FnWithParamInferred;

// T was fixed on declaration 
fn(1) // ok
fn("1") // err  

// T is decded by the caller
genericFn(1) // ok T is number for this call
genericFn("1") // ok T is string  for this call
genericFn<number>("1") // err T was specified as number but string was passed in 

Причиной ошибки, которую вы получаете, является то, что вы пытаетесь назначить функцию с параметром number для функции, которая должна принимать параметр любого типа T, с T, который должен определять вызывающий функции. Только универсальная функция может соответствовать типу FnWithParamInferred

var f: FnWithParamInferred = <T>(a: T) => { console.log(a) }

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

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

var f = (a: number) => { console.log(a) } // inferred as (a: number) => void

Или вы можете определить универсальную вспомогательную функцию для вывода T, но ограничить сигнатуру функции основан на FnWithRequiredParam

function createFunction<T>(fn: FnWithRequiredParam<T>) {
    return fn;
}

var f = createFunction((a: number) => { console.log(a) }) // inferred as FnWithRequiredParam<number>
0
ответ дан Titian Cernicova-Dragomir 16 January 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: