`export const test = <T>(a:string,{c,d} = {c: T[], D:T} = {})=>{} `
Как typescript делает дженерики обязательными
Я хочу определить функцию с типом T, чтобы разработчик должен был передать тип при ее использовании.
test<string>() ok
test<number>() ok
test() error
Чтобы отключить вывод типа, отключите вывод типа
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.htmltype 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 У них есть определение NoInfer
.
Но это, кажется, не работает. Моя структура данных export const test = <T>(a:string,{ c,d } = { c: T[] , D:T } = {} )=>{}
Как сделать структуру данных export const test = <T>(a:string,{c,d} = {c: T[], D:T} = {})=>{}
общей T обязательной
@Dimava С нетерпением жду вашей помощи.
@pink С нетерпением жду вашей помощи.
Используйте NoInfer<T>
вместо T
при использовании его в списке параметров.
@pink Я использовал NoInfer<T>, но это не сработало. Не могли бы вы написать демо, большое спасибо export const test = <T>(a:string,{c,d} = {c: (data: T) => T[];, D:T} = {})=>{}
@pink Ожидается соответствие требованиям приведенного выше теста, T является обязательным
@laterday tsplay.dev/wXvgQm Вы не можете сделать это ошибкой на самом test
, если не передадите дженерик. Вы можете сделать это ошибкой в списке аргументов, как это продемонстрировал Dimava здесь.
@Laterday обновлено. Если вы хотите один {}, вам понадобятся перезапуски, это сложнее
@Dimava Большое спасибо за вашу помощь. У меня нет глубокого понимания ТС. В чем разница между NoInfer и NeverIfNever
@laterday NeverIfNever<T>
– это never
, если T – это never
, и any
во всех остальных случаях (он использует [T]
хак, чтобы избежать T=never
случая игнорирования, но я думаю, что в этом случае он не нужен, так как он все равно вернет never
). NoInfer<T>
- это массив из 1 элемента, в котором выбран [0] элемент (с хаком T extends any ? 0 : never
(всегда 0) для предотвращения вывода)
«Я хочу определить функцию, которая имеет тип
T
, чтобы разработчик должен был передать тип при ее использовании». Вероятно, это проблема XY ; каков основной вариант использования, который, по вашему мнению, необходимо решить, сделав обязательным аргумент типа, указанный вручную? Также было бы неплохо увидеть минимальный воспроизводимый пример здесь; вы хотите, чтобы ваша функция вызывалась с нулевыми аргументами или с аргументами в вашей... литеральной строке шаблона... вещи... вверху?