I think you could go for a Resources style crafting configuration... For example:
extends Resource
class_name Recipe
var ingredients # List of object types, or object names, like ["wood", "ironbar"], you could leave it typed btw
var results = # Same as the other one like ["iron_pickaxe"]
And then have a global RecipeManager.gd that has all of that indexed, so you can try
RecipeManager.checkForCraft(["wood", "ironbar"]) and it could return "iron_pickaxe".
The big deal here is not exactly how you keep your "wood", "ironbar" etc, but that by having a "Resource" based object, you can port it to a CSV/JSON, so your Manager can read a CSV/JSON and create all the craftings, so you could have something like:
{
"0": {
"ingredients": ["wood", "ironbar"],
"results": ["iron_pickaxe"]
},
"1": {
"ingredients": ["water", "lava"],
"results": ["water_vapor", "obsidian"]
},
"3": {...}
}
Does that make any sense? Or does it give you any ideas?
EDIT: Something along the lines of this (awesome and complete) tutorial: