Как typescript делает дженерики обязательными?

`export const test = <T>(a:string,{c,d} = {c: T[], D:T} = {})=>{} `

Как typescript делает дженерики обязательными

Я хочу определить функцию с типом T, чтобы разработчик должен был передать тип при ее использовании.

test<string>()  ok
test<number>()  ok 
test()   error 

«Я хочу определить функцию, которая имеет тип T, чтобы разработчик должен был передать тип при ее использовании». Вероятно, это проблема XY ; каков основной вариант использования, который, по вашему мнению, необходимо решить, сделав обязательным аргумент типа, указанный вручную? Также было бы неплохо увидеть минимальный воспроизводимый пример здесь; вы хотите, чтобы ваша функция вызывалась с нулевыми аргументами или с аргументами в вашей... литеральной строке шаблона... вещи... вверху?

jcalz 14.04.2023 00:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы отключить вывод типа, отключите вывод типа

import { F } from 'ts-toolbelt'
function test<T = never>(a: string, b: F.NoInfer<T>[], c: F.NoInfer<T>) { }
//                ^ must have default, otherwise defaults to `unknown`

test('', [], '')
// function test<never>(a: string, b: never[], c: never): void

test<string>('', [''], '')
// ok

https://millsp.github.io/ts-toolbelt/modules/function_noinfer.html
type NoInfer<A>: [A][A extends any ? 0 : never]


Если вы хотите предотвратить использование простого аргумента, используйте

type NoInfer<T> = [T][T extends any ? 0 : never];
type NeverIfNever<T> = [T] extends [never] ? never : any;

export const test = <T = never>(
    a: string & NeverIfNever<T>,
    { c, d }: { c?: NoInfer<T>[]; d?: NoInfer<T> } = {}
) => {};

test('', {})
// Argument of type 'string' is not assignable to parameter of type 'never'.(2345)

Если у вас есть один аргумент fn, который является более сложным, спросите, если это необходимо.

Благодаря моей помощи, можно ли это реализовать, не полагаясь на ts-toolbelt?

laterday 13.04.2023 15:46

@laterday У них есть определение NoInfer.

zenly 13.04.2023 15:48

Но это, кажется, не работает. Моя структура данных export const test = <T>(a:string,{ c,d } = { c: T[] , D:T } = {} )=>{}

laterday 13.04.2023 16:02

Как сделать структуру данных export const test = <T>(a:string,{c,d} = {c: T[], D:T} = {})=>{} общей T обязательной

laterday 13.04.2023 16:08

@Dimava С нетерпением жду вашей помощи.

laterday 13.04.2023 17:10

@pink С нетерпением жду вашей помощи.

laterday 13.04.2023 17:10

Используйте NoInfer<T> вместо T при использовании его в списке параметров.

zenly 13.04.2023 17:13

@pink Я использовал NoInfer<T>, но это не сработало. Не могли бы вы написать демо, большое спасибо export const test = <T>(a:string,{c,d} = {c: (data: T) => T[];, D:T} = {})=>{}

laterday 13.04.2023 17:24

@pink Ожидается соответствие требованиям приведенного выше теста, T является обязательным

laterday 13.04.2023 17:30

@laterday tsplay.dev/wXvgQm Вы не можете сделать это ошибкой на самом test, если не передадите дженерик. Вы можете сделать это ошибкой в ​​​​списке аргументов, как это продемонстрировал Dimava здесь.

zenly 13.04.2023 17:32

@Laterday обновлено. Если вы хотите один {}, вам понадобятся перезапуски, это сложнее

Dimava 13.04.2023 20:05

@Dimava Большое спасибо за вашу помощь. У меня нет глубокого понимания ТС. В чем разница между NoInfer и NeverIfNever

laterday 14.04.2023 03:52

@laterday NeverIfNever<T> – это never, если T – это never, и any во всех остальных случаях (он использует [T] хак, чтобы избежать T=neverслучая игнорирования, но я думаю, что в этом случае он не нужен, так как он все равно вернет never). NoInfer<T> - это массив из 1 элемента, в котором выбран [0] элемент (с хаком T extends any ? 0 : never(всегда 0) для предотвращения вывода)

Dimava 14.04.2023 11:18

Другие вопросы по теме