Универсальная функция Typescript - PullRequest
0 голосов
/ 04 февраля 2019

Я что-то упустил из-за дженериков в машинописи.Предположим, что следующий пример:

type Caster<T> = (original: unknown) => T

const castA = <T>(original) => original as T
//                 ^^^ Parameter 'original' implicitly has an 'any' type.
const castB: Caster = <T>(original) => original as T
//            ^^^ Generic type 'Caster' requires 1 type argument(s).            
const castC: Caster<T> = (original) => original as T
//                 ^^^ Cannot find name 'T'.      ^^^

castA, castB и castC делают одно и то же: они приводят значение к типу T (некрасиво, но соответствует примеру).

Тип Caster<T> описывает приложение unknown -> T.Я предполагаю, что могу создать общие реализации такой функции, однако либо castA, castB и castC приводят к ошибкам компиляции (см. Комментарии).

Вместо этого очень хорошо работают следующие элементы:

// OK - but it's not generic
const castString: Caster<string> = (original: unknown) => original as string
// OK - but no reference to generic "Caster" type
const castGeneric = <T>(original: unknown) => original as T

Мне кажется немного неясным.Как я могу получить это поведение?Это было бы очень полезно (подумайте о фабричных методах)

Спасибо

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

const castC:Caster<T> = ...

Вам необходимо присвоить T определенный тип, тогда приведение C превратится в (original: unknown) => T

, например const castD:Caster<string> совпадает с constD:(original: unknown)=>string

0 голосов
/ 04 февраля 2019
const castC: Caster<T> = (original) => original as T

ожидает типа типа string

const castC: Caster<string> = (original) => original as string

, когда вы вызываете функцию, вы на самом деле используете дженерики.Так, type Caster<T> = (original: unknown) => T объявляет тип с обобщениями, но const castC: Caster<string> = (original) => original as string использует его


const castGeneric: Caster<T> = <T>(original: unknown) => original as T

Caster<T> является объявлением типа для castGeneric, поэтому ему необходим фактический тип

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