Giordano,
O TLPP dá suporte a tipagem de parâmetros de forma até mesmo a gerar exceção quando o parâmetro é recebido em um tipo diferente do esperado, porém permite valores nulos, logo a questão de todos os parâmetros não serem obrigatórios continua.
O ParamType permite forçar um tipo para o parâmetro, gerando exceção em caso de valor diferente, parâmetros obrigatório e valores padrões.
Ele ainda pode ser utilizado, porém agora a verificação de tipo é feita pelo binário em TLPP, ela acabaria sendo feita duas vezes.
Você poderia apenas utilizar o default para o questão de valores padrões, agora a questão de parâmetros obrigatórios, teria que ser feita manual ou utilizando o ParamType.
Eu pessoalmente evito o uso do ParamType, ele faz verificações de valores nulos, ValType, atribuições etc... E tudo isso por um único parâmetro, para funções/métodos que não serão chamadas em loop, isso não faz grande diferença, porém se sua função/métodos ser chamado dentro de um loop, você perceberá a questão de performance. Caso queira ver tudo isso, recomendo gerar o PPO de uma função/método que foi usado o ParamType, verá um código um tanto quanto extenso. Se desejar verificar as questões de performance citadas, gere um LogProfiler da execução com e sem o ParamType.
Obs.: O default teve seu funcionamento alterado devido ao TLPP, pois caso a variável esteja tipada, pode não ser possível verificar se ela é nula dentro de um IIF, logo ele passou de uma verificação de nil para um ValType, então o default também faz um ValType para comparar se é U (nulo).
Aqui um pequeno exemplo utilizando seu método, execute ele e veja os valores no console, pode ficar mais claro o funcionamento da tipagem em TLPP:
#include "protheus.ch"
//-------------------------------------------------
/*/{Protheus.doc} u_TestingParameters
Função para teste de parâmetros tipados em TLPP
@author Daniel Mendes
@since 08/08/2022
@version 1.0
/*/
//-------------------------------------------------
function u_TestingParameters()
local oWorkMail as object
oWorkMail := WorkMail():new()
oWorkMail:send()
oWorkMail:send({"Xisto"})
oWorkMail:send({"Xisto"}, "Xisto")
oWorkMail:send(, "Xisto")
oWorkMail:send(1, ) //Vai gerar exceção, pois o tipo recebido não é suportado
oWorkMail:send(, 1) //Também geraria exceção, porém não vai chegar nessa linha...
return
//-------------------------------------------------
/*/{Protheus.doc} WorkMail
Classe para teste de parâmetros
@author Daniel Mendes
@since 08/08/2022
@version 1.0
/*/
//-------------------------------------------------
class WorkMail
public method new() as object
public method send()
endclass
//-------------------------------------------------
/*/{Protheus.doc} new
Construtor da classe
@author Daniel Mendes
@since 08/08/2022
@version 1.0
/*/
//-------------------------------------------------
method new() as object class WorkMail
return self
//-------------------------------------------------
/*/{Protheus.doc} send
Método para teste de parâmetros
@param aBody, array, Corpo
@param cMsgErr, character, Mensagem de erro
@author Daniel Mendes
@since 08/08/2022
@version 1.0
/*/
//-------------------------------------------------
method send(aBody as array, cMsgErr as character) class WorkMail
conout("aBody", valType(aBody), aBody, "")
conout("cMsgErr", valType(cMsgErr), cMsgErr, "")
return