Suponha que eu tenha o seguinte tipo:
export type Foo<T> = (() => T)
É possÃvel remover a length
propriedade dele e mantê-la exigÃvel?
Além disso, usar Omit
, Omit<(() => T), 'length'>
evita que ele possa ser chamado.
Suponha que eu tenha o seguinte tipo:
export type Foo<T> = (() => T)
É possÃvel remover a length
propriedade dele e mantê-la exigÃvel?
Além disso, usar Omit
, Omit<(() => T), 'length'>
evita que ele possa ser chamado.
Você realmente não pode fazer isso. Todos os callables no TypeScript herdam do interface
Function
, que é definido na biblioteca TypeScript es5.d.tslength
para ter uma propriedade numérica . Qualquer coisa que você fizer que resulte em um tipo que pode ser chamado terá essalength
propriedade presente.A única maneira de mudar isso seria bifurcar o es5.d.ts localmente e removê-lo, mas isso provavelmente quebraria muitas coisas e seria difÃcil de manter. Provavelmente a abordagem "correta" seria criar uma regra de linter personalizada para que o uso da função
length
avise que pode ser um erro. No próprio TypeScript, porém, você não tem muitas opções.Você não pode ampliar uma função para algo sem
length
e ainda assim chamá-la, mas pode restringir uma função para algo quelength
é estranho/inutilizável. A abordagem padrão é restringir ao tiponever
que é um subtipo universal e, portanto, você sempre pode restringir a ele:Mas isso não o impedirá de verificar
f.length
a veracidade, já que aténever
é permitido lá. O TypeScript reclama muito pouco quando se trata de verificações de veracidade; na verdade, a única coisa que encontrei foi quando você verifica uma função, mas não a chama. Portanto, podemos fazer a loucura de dizer ao TypeScript que alength
propriedade é ambasnumber
e alguma função:Mas isso é realmente uma mentira vil; o erro diz que você pretendia ligar
f.length
e, de fato, você pode fazer isso (embora eu tenha dificultado ao fornecer umnever
parâmetro):Então, eu diria que esse não é realmente o tipo de coisa que o TypeScript pode fazer por você.
Link do Playground para o código